cd 程序文件错误:找不到位置参数

6 powershell

PS C:\> cd Program Files
Run Code Online (Sandbox Code Playgroud)

当我发出这个命令时,我不知道为什么,但它不接受Program Files. 相同的命令在cmd.

这是它显示的错误:

Set-Location : A positional parameter cannot be found that accepts argument 'Files'.
At line:1 char:1
+ cd Program Files
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-Location], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetLocationCommand
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 14

正如Maximilian Burszley 的有用答案中所述Program Files被解析为两个参数,因为空格用于分隔命令行参数。

您的使用尝试cd Program Files可能受到cmd.exe(遗留命令提示符)的启发,这种语法确实有效;然而,即使在那里,它在概念上也违反了参数解析的通常规则。

因此,您需要使用一种引用形式,以便将包含空格的值作为单个参数传递

您有多种选择来实现此引用:

  • 使用'...' 周围文字值,即应该按原样使用。

  • 使用"..." 围绕在您要嵌入值变量引用(例如$HOME)或子表达式(例如,$(Get-Date)

  • 使用`以引号(逃逸)一个字符。

因此,您可以使用以下任何一种:

cd 'Program Files'
cd "Program Files"  # as there are no $-prefixed tokens, the same as 'Program Files'
cd Program` Files   # `-escape just the space char.
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用制表符全将包含空格的路径的(无空格)前缀扩展为其完整形式,并隐式应用引用

例如,如果您在C:\并输入:

cd Program<tab>
Run Code Online (Sandbox Code Playgroud)

PowerShell 自动完成命令以:

 cd '.\Program Files\'
Run Code Online (Sandbox Code Playgroud)

请注意Program Files(以及.\引用当前目录和尾随\以指示目录。) 是如何自动单引号的


Dhr*_*ekh 5

cd C:\Program` Files\ 
Run Code Online (Sandbox Code Playgroud)

`只需将文件夹名称中的空格转义即可。


The*_*le1 4

原因是语法无效。powershell 命令的每个参数都用空格分隔,因此您实际执行的操作类似于:

Set-Location -Path Program -Arg2 Files
Run Code Online (Sandbox Code Playgroud)

但是Set-Location(aliased: cd) 没有第二个位置的任何位置参数,因此它无法将其绑定到任何参数并在命令中使用它,因此会出现终止错误。


如果你想要一个更简单的cd别名,你可以这样做(在你的$profile):

function ChangeDirectory {
    param(
        [Parameter(
            Position = 0,
            Mandatory,
            ValueFromRemainingArguments
        )]
        [string[]] $Path
    )

    Set-Location -Path ($Path -join ' ')
}
Set-Alias -Name cd -Value ChangeDirectory
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您没有指定相对路径 ( .\),它将使用当前驱动器的根路径(最有可能的是C:\)。这可以在函数中进行调整以测试两个位置(相对位置和驱动器根位置),但是如果它们都存在,则确定使用哪一个位置的逻辑将很棘手(或者始终可以默认为相对位置)。