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(以及.\引用当前目录和尾随\以指示目录。) 是如何自动单引号的。
原因是语法无效。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:\)。这可以在函数中进行调整以测试两个位置(相对位置和驱动器根位置),但是如果它们都存在,则确定使用哪一个位置的逻辑将很棘手(或者始终可以默认为相对位置)。
| 归档时间: |
|
| 查看次数: |
16160 次 |
| 最近记录: |