无法使用 cd 向前移动

Unable to move forward using cd

提问人:Robert 提问时间:9/21/2020 最后编辑:Robert 更新时间:8/17/2023 访问量:286

问:

我在使用 PowerShell 的路径中前进时遇到问题。我能够向上移动目录,但不能向下移动。情况如下:

我打开 PowerShell 并键入“pwd”命令,它显示我当前在 PS C:\Users\Robert Inspiron14 中>

我键入命令“cd..”,现在我移动到 PS C:\Users>

然后,我尝试通过键入“cd C:\Users\Robert Inspiron14”来更改目录,但无法更改。不幸的是,由于缺乏声誉,我还不能发布图片。

我能够在 CMD 中执行更改,但不能在 PowerShell 中执行更改。另外,我不知道如何将用户从“Robert Inspiron14”更改为“Robert”。任何帮助都是值得赞赏的!

PowerShell 目录 CD

评论

2赞 Mathias R. Jessen 9/21/2020
更改为cd C:\Users\Robert Inspiron14cd 'C:\Users\Robert Inspiron14'
0赞 mklement0 9/21/2020
请允许我在下一条评论中给你给新人的标准建议(你应该接受 Mathias 的回答)。

答:

2赞 Mathias R. Jessen 9/21/2020 #1

在 PowerShell 可以执行命令之前,它需要对其进行分析,PowerShell 的分析器会按如下方式解释命令:cd

cd  C:\Users\Robert Inspiron14
\/  \_____________/ \________/
Command Name  |            |
             argument 1    |
                         argument 2

换言之,并被解释为单独的参数C:\Users\RobertInspiron14

这两个参数都不是有效目录的路径,因此(或者更确切地说是别名)会引发错误。cdSet-Locationcd

可以通过使用引号限定其边界来强制 PowerShell 识别为单个字符串参数(两者都有效):C:\Users\Robert Inspiron14"'

cd 'C:\Users\Robert Inspiron14'

可以在 about_Parsing 帮助主题中详细了解 PowerShell 如何分析命令表达式

评论

0赞 Robert 9/21/2020
了不起。在你解释之后,我也意识到我也可以用 ' 来表示空间。
0赞 Mathias R. Jessen 9/21/2020
这也行得通 - 它逃脱了空间 - 告诉 PowerShell 的解析器“不要像往常一样对待下一个”
0赞 mklement0 9/21/2020
干得好;狡辩:虽然这两个参数都不是有效的目录路径,但发生错误的原因是在位置上只接受一个参数,并且由此产生的语法错误会抢占对是否存在的任何检查。Set-LocationC:\Users\Robert
2赞 mklement0 9/21/2020 #2

为了补充 Mathias R. Jessen 的有用回答,提供更多背景信息:

在所有 shell 中,引用包含空格的参数是一般的语法必要条件,因为未带引号的空格用于分隔多个参数

不仅空格需要引号,而且 PowerShell 的任何所谓字符(当不加引号使用时具有句法功能的字符);例如,将路径传递到字面上命名的目录也需要引用,否则这将被解释为语句分隔符a;b;

  • 请注意,PowerShell 的元字符比两者都多;有关完整列表,请参阅此答案cmd.exe

有多种引用样式

另请注意:

  • 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”周围的 是必需的。使用子表达式$(...)),规则会变得更加复杂,因此最简单的方法是始终使用“...”引号。