首页 > 解决方案 > 呼叫运算符 (&) 的语法问题

问题描述

我正在研究一个通用/通用 PS 脚本,我可以用它在多台机器上远程执行其他脚本。为此使用 psexec。我知道还有其他方法可以做到这一点,但 psexec 在我的场景中似乎是最可靠的。

这是我最初尝试的摘录:

SWITCH ($ScriptExt) {
    '.bat' {$ShellCmd = 'CMD /C'}
    '.cmd' {$ShellCmd = 'CMD /C'}
    '.ps1' {$ShellCmd = 'powershell -ExecutionPolicy Unrestricted -File'}
    [...]
    }
}

Get-Content $PcList | ForEach-Object {

    & "$PSScriptRoot\..\psexec.exe" \\$_.$Domain -u $Domain\$AdminUser -p $AdminPassword -h -i $ShellCmd $ScriptPath $ScriptArgs  ## Does NOT work...

    [...]
}

这不起作用:psexec 每次都会出错,告诉我它无法在远程 PC 上运行程序,即使它提供的路径看起来正确。

还尝试在 ForEach 中添加一些引号:

& "$PSScriptRoot\..\psexec.exe" "\\$_.$Domain -u $Domain\$AdminUser -p $AdminPassword -h -i $ShellCmd $ScriptPath $ScriptArgs" ## Does NOT work...

...以及其他各种迭代以尝试使其正常工作。

在进行更多故障排除后,我发现是 $ShellCmd 变量导致了问题。如果我在 ForEach 中对该部分进行硬编码,如下所示:

& "$PSScriptRoot\..\psexec.exe" \\$_.$Domain -u $Domain\$AdminUser -p $AdminPassword -h -i powershell -ExecutionPolicy Unrestricted -File $ScriptPath $ScriptArgs

...它有效,但它是一个黑客。

任何人都知道我可能在语法上做错了什么?比较我的工作示例和非工作示例,除了我尝试将 $ShellCmd 变量合二为一之外,几乎没有什么区别。

标签: powershellpsexec

解决方案


为了补充 TheIncorrigible1 的有用答案

就像$ShellCmd不能作为单个字符串传递一样- 因为它将作为单个参数传递- 而必须作为参数数组(字符串)传递,所以 must $ScriptArgs
你没有在问题中显示它的价值,但我提到它只是为了清楚。

顺便说一句:在将包含数组的变量作为单独的参数传递给外部程序时,您并不严格需要splatting运算符 ( ),因此在这种情况下可以使用常规(数组)变量引用。[1]@$


[1] @arrayvs.$array仅在一种极端情况下有所不同:如果数组元素之一包含--%,则停止解析符号@array将其视为此类(并因此修改剩余参数的解析方式);相反,$array将其视为文字字符串。


推荐阅读