powershell - 呼叫运算符 (&) 的语法问题
问题描述
我正在研究一个通用/通用 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 变量合二为一之外,几乎没有什么区别。
解决方案
为了补充 TheIncorrigible1 的有用答案:
就像$ShellCmd
不能作为单个字符串传递一样- 因为它将作为单个参数传递- 而必须作为参数数组(字符串)传递,所以 must $ScriptArgs
。
你没有在问题中显示它的价值,但我提到它只是为了清楚。
顺便说一句:在将包含数组的变量作为单独的参数传递给外部程序时,您并不严格需要splatting运算符 ( ),因此在这种情况下可以使用常规(数组)变量引用。[1]@
$
[1] @array
vs.$array
仅在一种极端情况下有所不同:如果数组元素之一包含--%
,则停止解析符号仅@array
将其视为此类(并因此修改剩余参数的解析方式);相反,$array
将其视为文字字符串。
推荐阅读
- android - 如何在 Playstore 等嵌套 Recyclerview 中从 mysql 检索数据
- perl - 查找给定文件是否存在于目录中
- rust - 特征可以为其继承的特征的方法提供默认实现吗?
- php - SQL-如何将表B的多个ID存储到表A中?
- c# - 如何从 C# 运行 msinfo32 控制台命令?
- prestashop-1.6 - 有没有办法在不使用覆盖的情况下在模块中使用 prestashop 核心控制器?
- android - 应用内购买未登录 firebase android
- c# - 使用嵌套查询扩展时抛出多个并发操作异常
- node.js - 如何获取从一个集合到另一个集合的数据引用?蒙古数据库
- react-native - 在 ReactNative 中使用 Google 放置搜索自动完成 ..description 结果隐藏了我的屏幕组件