如何在命令行中运行带有路径空格的PowerShell脚本?

43

我尝试了很多种在命令行中运行PowerShell脚本的方法,但每一种都返回错误。

这是该路径:


这是路径:
C:\Users\test\Documents\test\line space\PS Script\test.ps1

我尝试过这些:

powershell -File '"C:\Users\test\Documents\test\line space\PS Script\test.ps1"'

powershell "& ""C:\Users\test\Documents\test\line space\PS Script\test.ps1"""

Powershell "& 'C:\Users\test\Documents\test\line space\PS Script\test.ps1'"

Powershell -File 'C:\Users\test\Documents\test\line space\PS Script\test.ps1'"

我遇到了以下这些错误:

& : 无法将'C:\Users\test\Documents\test\line space\PS Script' 识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请验证路径是否正确,然后重试。

Processing -File ''C:\Users\test\Documents\test\line space\PS Script'' failed: 给定路径的格式不受支持。请指定有效的路径作为 -File 参数。

我该如何解决?


1
你为什么要从命令行运行它? - Maximilian Burszley
5个回答

56

-File参数

如果您想从命令行运行powershell.exe -File,则必须始终使用双引号(")设置包含空格的路径。单引号(')只有 PowerShell 可以识别。但是,由于命令行调用了 powershell.exe(因此处理了文件参数),所以必须使用"

powershell.exe -File "C:\Users\test\Documents\Test Space\test.ps1" -ExecutionPolicy Bypass

-Command参数

如果您使用-Command参数而不是-File参数,则-Command内容会被PowerShell处理。因此,在这种情况下,您必须使用"内部的'

powershell.exe -Command "& 'C:\Users\test\Documents\Test Space\test.ps1'" -ExecutionPolicy Bypass

双引号由命令行处理,而& 'C:\Users\test\Documents\Test Space\test.ps1'是 PowerShell 实际处理的命令。

显然,解决方案 1 更简单。

请注意,如果不指定任何参数,-Command也是默认使用的参数。

powershell.exe "& 'C:\Users\test\Documents\Test Space\test.ps1'" -ExecutionPolicy Bypass

这也可以起作用。

-EncodedCommand参数

您可以将命令编码为Base64。这可以解决许多“引用”问题,有时(但在您的情况下不是唯一的方法)是唯一可行的方法。

首先,您必须创建已编码的命令。

$Command = "& 'C:\Users\test\Documents\Test Space\test.ps1'"
[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($Command))

然后你可以像这样使用 -EncodedCommand 参数

powershell.exe -EncodedCommand JgAgACcAQwA6AFwAVQBzAGUAcgBzAFwAdABlAHMAdABcAEQAbwBjAHUAbQBlAG4AdABzAFwAVABlAHMAdAAgAFMAcABhAGMAZQBcAHQAZQBzAHQALgBwAHMAMQAnAA== -ExecutionPolicy Bypass

2
干得好!顺便说一下,在 PowerShell Core 中,-File 现在是默认选项(这个变化是为了支持 Unix shebang 行)。 - mklement0
3
我觉得这个答案比被采纳的答案更好。对于我来说,仅仅使用-file参数将文件路径放在引号中根本不起作用。 - Tyler Nielsen

33

试试这个:

& "C:\Users\test\Documents\test\line space\PS Script\test"

4
他正在尝试使用 cmd,所以我认为他是从一个 .cmd 或者 .bat 文件中调用它。PS Invoke (&) 操作符对他没有任何好处。 - Maximilian Burszley
如果在PowerShell中使用“&”作为前缀,则PS C:>&“C:\ Temp \ Folder with Whitespaces \ SomeApp.exe”/ switchA valA / switchB valB将起作用。 如果没有“&”,它会出错。 对于DOS控制台,不需要使用“&”。 我认为这就是C.Hennessey的意思。 - cghore
啊...和号...正是我正在寻找的。 - raddevus
这个问题甚至在谷歌搜索如何在PowerShell中运行ps脚本时也会出现,这就是为什么这个答案是相关的(对于那些好奇的人来说)。 - undefined
有时候你需要在命令行上运行带参数的程序,这种方法是可行的。 - undefined

8
在您的示例中,您无故混合使用引号和双引号。
IF EXIST "C:\Users\test\Documents\test\line space\PS Script\test.ps1" (
  powershell -ExecutionPolicy Unrestricted -File "C:\Users\test\Documents\test\line space\PS Script\test.ps1"
)

1
这对我没用,脚本没有触发。我尝试运行了这一部分:powershell -ExecutionPolicy Unrestricted -File 'C:\Users\test\Documents\test\line space\PS Script\test.ps1',并得到了以下错误提示: 给定路径的格式不受支持。 - Awsmike
@Awsmike 尝试删除单引号,看看会发生什么。 - Maximilian Burszley
处理 - 文件 C:\Users\test\Documents\test\line space\PS Script\test.ps1 失败,因为该文件没有 '.ps1' 扩展名。请指定一个有效的 Windows PowerShell 脚本文件名,然后重试。 - Awsmike
好的,所以它将空格解释为文件的额外参数。首先,路径是否有效?@Awsmike - Maximilian Burszley
你使用双引号而不是单引号的原始答案实际上起作用了! - Awsmike

0

如果您使用参数,可以按照以下方式操作。

powershell.exe -command "& {&'C:\A B C\foo.ps1' param1 param2}"

在这里感谢Hesham A. Amin的一篇博客文章 :-)


0

我需要传递一个带有空格的参数。

我正在将文件拖放到批处理文件上,该文件在服务器上的路径和/或文件名中包含空格。在测试了上面的答案后,我让它工作了。请注意,在启动PowerShell可执行文件之前,我会更改为工作目录。

批处理文件:

pushd O:\Data\QuickList
start powershell -noexit -Command ".\QuickList.ps1 -datafile '%1'"
popd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接