【问题标题】:Set-Location : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Path'. Specified method is not supported设置位置:无法将“System.Object[]”转换为参数“Path”所需的类型“System.String”。不支持指定的方法
【发布时间】:2021-02-07 09:10:09
【问题描述】:

所以我的脚本很简单。我有一个命令需要使用 OpenVPN 执行,所以我需要 cd 到该文件夹​​并执行:.\openvpn.exe $someCommand

问题是,当我尝试使用cdSet-Location 时出现此错误:

Set-Location : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Path'. Specified method is not supported.

在搜索解决方案后,我找到了使用Get-ChildItem -Path $path 的解决方法,然后使用$_.Directory 属性,但这也不起作用。

基本上我有这样的东西:

$openVpnPath = "C:\Program Files\OpenVPN\bin"
Invoke-Command -ScriptBlock {
    Set-Location $openVpnPath,
    ".\openvpn.exe $conf"
}

该位置是常规路径。如果你想知道为什么Set-Location 的末尾有一个逗号,那是因为我读到我可以在同一个Invoke-Command 块中执行 2 个命令。我错了吗?

谢谢:)

【问题讨论】:

  • 额外的".\openvpn.exe $conf" 究竟应该为 Set-Location 做什么?还是您可能不打算在第一个命令的末尾使用逗号
  • Set-Location 采用单个字符串作为 -Path 参数。我怀疑您在路径中有空格,并且该命令将您传递的任何内容视为多条路径。简而言之,将路径放在引号中,或者仅使用完整路径引用 .\openvpn.exe(也包含在引号中)。顺便说一句,我刚刚注意到脚本块。使用 $using:openVpnPath 来引用变量。
  • 删除Set-Location $openVpnPath之后的,
  • 我已经投票结束,因为错字。
  • @LasseV.Karlsen 我读到我可以在同一个 Invoke-Command 块中执行 2 个命令,因此使用逗号。这不是错字:)

标签: powershell


【解决方案1】:

除非您是远程执行命令,否则我不明白为什么必须使用Invoke-Command

$openVpnPath = "C:\Program Files\OpenVPN\bin"
Set-Location $openVpnPath,
".\openvpn.exe $conf"

上面的还是不行:

  • 按照Mathias R. Jessen's comment 删除逗号,
  • ".\openvpn.exe $conf" 是一个字符串 - 它会被打印出来,因为没有任何东西告诉 PowerShell 执行它(也许这就是你使用 Invoke-Command 的原因?)

一种方式:

$openVpnPath = "C:\Program Files\OpenVPN\bin"
Set-Location $openVpnPath
.\openvpn.exe $conf

Set-Location 的要求只是因为您使用的是路径.\openvpn.exe,其中. 指的是当前目录...所以让我们将其替换为 OpenVPN 目录。

更好的方法,使用call operator(可能与此处的dot sourcing 相同,但我认为更好的做法-related

$openVpnPath = "C:\Program Files\OpenVPN\bin\openvpn.exe"
& $openVpnPath $conf

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多