我正在开发一个通用/通用 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"##不起作用...
...以及各种其他迭代来尝试使其发挥作用。
在进行更多故障排除后,我发现是 $ShellCmd 变量导致了问题。如果我在 ForEach 中硬编码该部分,如下所示:
& "$PSScriptRoot\..\psexec.exe" \\$_.$Domain -u $Domain\$AdminUser -p $AdminPassword -h -i powershell -ExecutionPolicy Unrestricted -File $ScriptPath $ScriptArgs
...它可以工作,但它是一个黑客。
有人知道我的语法可能做错了什么吗?比较我的工作示例和非工作示例,除了我尝试在其中使用 $ShellCmd 变量之外,几乎没有什么区别。
最佳答案
我认为问题可能是您违反了引用规则。
尝试分解你的命令并使用splatting:
$shell = 'powershell', '-ExecutionPolicy', 'Unrestricted', '-File'
& "$PSScriptRoot\..\psexec.exe" ... @shell $scriptPath $scriptArgs
顺便说一句,我强烈建议使用 WinRM 和 PSRemoting 而不是 psexec。
关于powershell - 调用运算符 (&) 的语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57631715/