powershell - 调用运算符 (&) 的语法问题

标签 powershell psexec

我正在开发一个通用/通用 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/

相关文章:

sharepoint - 使用PowerShell自动部署解决方案

powershell - 将过程信息转换为人类可读的值

python - 使用 psexec 在远程机器上运行 AutoIt

java - 使用 java 获取正在运行的应用程序列表,然后向其发送按键

psexec - 如何通过psexec检查远程服务器时间

arrays - 计算数组的长度,如果只包含一个元素则返回1

c# - 如何将 C# 控制台转换为 Powershell?

powershell - PowerShell UICulture与Windows设置

windows-8 - PsExec Windows 8访问被拒绝

powershell - 通过 Powershell 中的 Invoke-Command 从网络共享运行 Setup.exe