提问人:Robert 提问时间:9/21/2020 最后编辑:Robert 更新时间:8/17/2023 访问量:286
无法使用 cd 向前移动
Unable to move forward using cd
问:
我在使用 PowerShell 的路径中前进时遇到问题。我能够向上移动目录,但不能向下移动。情况如下:
我打开 PowerShell 并键入“pwd”命令,它显示我当前在 PS C:\Users\Robert Inspiron14 中>
我键入命令“cd..”,现在我移动到 PS C:\Users>
然后,我尝试通过键入“cd C:\Users\Robert Inspiron14”来更改目录,但无法更改。不幸的是,由于缺乏声誉,我还不能发布图片。
我能够在 CMD 中执行更改,但不能在 PowerShell 中执行更改。另外,我不知道如何将用户从“Robert Inspiron14”更改为“Robert”。任何帮助都是值得赞赏的!
答:
在 PowerShell 可以执行命令之前,它需要对其进行分析,PowerShell 的分析器会按如下方式解释命令:cd
cd C:\Users\Robert Inspiron14
\/ \_____________/ \________/
Command Name | |
argument 1 |
argument 2
换言之,并被解释为单独的参数。C:\Users\Robert
Inspiron14
这两个参数都不是有效目录的路径,因此(或者更确切地说是别名)会引发错误。cd
Set-Location
cd
可以通过使用引号限定其边界来强制 PowerShell 识别为单个字符串参数(两者都有效):C:\Users\Robert Inspiron14
"
'
cd 'C:\Users\Robert Inspiron14'
可以在 about_Parsing
帮助主题中详细了解 PowerShell 如何分析命令表达式
评论
Set-Location
C:\Users\Robert
为了补充 Mathias R. Jessen 的有用回答,提供更多背景信息:
在所有 shell 中,引用包含空格的参数是一般的语法必要条件,因为未带引号的空格用于分隔多个参数。
不仅空格需要引号,而且 PowerShell 的任何所谓元字符(当不加引号使用时具有句法功能的字符);例如,将路径传递到字面上命名的目录也需要引用,否则这将被解释为语句分隔符。a;b
;
- 请注意,PowerShell 的元字符比两者都多;有关完整列表,请参阅此答案。
cmd.exe
有多种引用样式:
由于路径值是文本(不包含变量引用或表达式),因此逐字(单引号)字符串 (
'...'
) 是最佳选择。cd 'C:\Users\Robert Inspiron14'
如果路径包含变量或子表达式,则必须使用可扩展(双引号)字符串 (
“...”
)[1]cd "$HOME\Documents"
另一种不太常见的解决方案是使用 ' 单独转义空格字符,即所谓的反引号,PowerShell 的转义字符
:
cd C:\Users\Robert` Inspiron14
另请注意:
PowerShell 的 Tab 自动补全功能会根据需要自动应用引号。
cd..
是 PowerShell 中内置函数的名称,其唯一目的是模拟cmd.exe
的(可疑的允许)行为(见下文);该函数执行语法正确的调用(通过执行 验证),命令名称与其参数之间用空格分隔。Set-Location ..
${function:cd..}
对比:cmd.exe
不幸的是,cmd.exe
的内置 cd
命令决定不强制执行其通常的语法规则,并启用了诸如 cd C:\Program Files
之类的调用。
它不应该这样做:虽然乍一看很方便,但它构成了一个有问题的例外,与引起混淆的通常规则不同。
请注意,制表符补全会正确地将包含空格的参数引号引号。cmd.exe
同样,不幸的是,cd..
被允许作为正确cd.
.的语法例外替代品 - 有关详细信息,请参阅对此答案的评论。
[1] 注意 如果您在路径中使用变量引用,则 “...”
-引号并不是绝对必要的,只要任何文字成分不需要引号;例如,$HOME\foo
无需引用即可,而“$HOME\foo bar”
周围的 “
是必需的。使用子表达式 ($(...)
),规则会变得更加复杂,因此最简单的方法是始终使用“...”
引号。
评论
cd C:\Users\Robert Inspiron14
cd 'C:\Users\Robert Inspiron14'