PS C:\> cd Program Files
当我发出此命令时,我不知道为什么,但是它不接受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
答案 0 :(得分:4)
原因是语法无效。 powershell命令的每个参数都由空格分隔,因此您实际上正在执行以下操作:
UIView
但是Set-Location -Path Program -Arg2 Files
(别名为Set-Location
)没有第二个位置的位置参数,因此它无法将其绑定到任何参数并在命令中使用它,因此会出现终止错误
如果您想要一个更简单的cd
别名,则可以执行以下操作(在您的cd
中):
$profile
但是请注意,如果您未指定相对路径(function ChangeDirectory {
param(
[Parameter(
Position = 0,
Mandatory,
ValueFromRemainingArguments
)]
[string[]] $Path
)
Set-Location -Path ($Path -join ' ')
}
Set-Alias -Name cd -Value ChangeDirectory
),它将使用当前驱动器的根路径(很可能是.\
)。可以在函数中对此进行调整,以测试两个位置(相对位置和驱动器根),但是弄清楚如果两个位置都存在,则要弄清楚要使用哪个位置的逻辑很麻烦(或者可以始终默认为相对位置)。
答案 1 :(得分:2)
如TheIncorrigible1's helpful answer中所述,Program Files
被解析为两个参数,因为空格用于分隔命令行参数。>
您尝试使用cd Program Files
的方法可能受cmd.exe
(旧式命令提示符)的启发,该语法确实有效。但是,即使在概念上,它也违反了参数解析的通常规则。
因此,您需要使用 quoting 形式,以便将包含空格的值作为单个参数传递。
您可以通过多种方法来实现此报价:
在{em>文字的值附近使用'...'
,即应原样使用。
在要嵌入变量引用(例如"..."
)或子表达式的值中使用$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.
此外,正如LotPings在评论中提到的,您可以使用 tab-completion 来扩展(无空格)前缀包含空格的完整路径的em>路径,并隐含引用。
例如,如果您在C:\
中,并且输入:
cd Program<tab>
PowerShell自动完成以下命令:
cd '.\Program Files\'
请注意,如何自动将Program Files
(连同.\
引用当前目录,并在末尾的\
上指示目录)。
答案 2 :(得分:0)
cd C:\Program` Files\
`只是转义文件夹名称中的空格。