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

cld4siwp  于 2022-11-29  发布在  Shell
关注(0)|答案(5)|浏览(644)
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
42fyovps

42fyovps1#

    • tl; dr**

由于您的目录名包含 * 空格 *,因此必须用 * 引号 * 括起来,例如:

# Note: In PowerShell, 'cd' is an alias of 'Set-Location'
cd 'Program Files'

Maximilian Burszley's helpful answer中所述,Program Files被解析为 * 两个 * 参数,因为空格用于 * 分隔 * 命令行参数。
您尝试使用cd Program Files可能是受到cmd.exe(传统的命令提示符)的启发,这种语法确实适用;然而,即使在那里,它也在概念上违反了参数解析的通常规则。
因此,您需要使用 * 引号 * 的形式,以便将 * 包含空格 * 的值作为 * 单个 * 参数传递。
您可以选择以下几种方式来实施此报价:

  • 使用'...' * 将 * 文字 * 值括起来,即,应该 * 逐字 * 使用的值; '...'字符串称为 * 逐字 *(单引号)字符串。
  • 在要嵌入 * 变量引用 *(如$HOME)或 * 子表达式 *(如$(Get-Date);也就是说,"..."字符串执行 * 字符串插值 *,它们被称为 * 可扩展 *(双引号)字符串。
  • 使用将 * 单个 * 字符引起来(转义);,也就是所谓的 * backtick *,是PowerShell的通用escape character

因此,您可以使用下列任一项:

cd 'Program Files'
cd "Program Files"  # as there are no $-prefixed tokens, same as 'Program Files'
cd Program` Files   # `-escape just the space char.

此外,您可以使用 * Tab键完成将包含空格的路径的(无空格) 前缀 * 扩展为完整形式 *,并隐式应用引号 *。
例如,如果您在C:\中输入:

cd Program<tab>

PowerShell会自动完成命令,以便:

cd '.\Program Files\'

请注意Program Files(与.\一起表示当前目录,后面的\表示目录)是如何 * 自动用单引号引起来 * 的。

    • 使用 * 通配符表达式 * 作为参数**:

如前所述,在PowerShell中,cd是**Set-Location**cmdlet的内置别名。

  • 按位置 * 传递路径-例如Set-Location 'C:\Program Files'-将其隐式绑定到-Path参数;也就是说,它等价于Set-Location -Path 'C:\Program Files'
    • -Path会将其参数解译为wildcard expression**,因此您可以执行类似Set-Location C:\Win*的动作,以变更为C:\Windows(假设万用字符运算式只符合 * one * 目录)。

cmd.exe不同的是,在PowerShell通配符表达式中不仅*?具有特殊含义,而且[]也具有特殊含义(对于[abc][a-c]等字符集和字符范围表达式),因此Set-Location Foo[1]将 * 不 * 用于更改到 * 字面上 * 名为Foo[1]的目录。
在这种情况下,必须使用**-LiteralPath参数**-
Set-Location -LiteralPath Foo[1]-确保路径是**逐字 *(逐字)**解释的。

w9apscun

w9apscun2#

cd C:\Program` Files\

**"'**只转义文件夹名中的空格。

ldfqzlk8

ldfqzlk83#

原因是语法无效。powershell命令的每个参数都是用空格分隔的,所以你实际上做的事情类似于:

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

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

rqenqsqc

rqenqsqc4#

使用引号(双引号或单引号)转到白色或特殊符号的文件夹或路径。

例如:-

cd "C:\Users\LAPTOP0534\OneDrive - My Content (Active Directory)"

cd 'OneDrive - My Content (Active Directory)\My Folder'

对于您的情况,它将是PS C:\> cd "Program Files"

bhmjp9jg

bhmjp9jg5#

这是因为句子之间的空格。在此处输入代码您完成了选项卡。替换PS F:〉cd新文件夹与PS F:〉cd在PowerShell中的“新文件夹”。或者查看F:〉cd './new folder'.我是个初学者,你应该试试这个。

相关问题