我有问题通过PowerShell在远程服务器上执行batch file。 用户可以在Servername , 启动或查杀进程, Servicename等popup窗口中select多个意见。 所选项目将保存在variables中。
如果select了所有项目,我想将string合并到一个string并执行命名为这个结果string的批处理脚本。 我尝试按照这篇文章中的描述来做,但批处理脚本不会被执行。
例:
[String]$scriptpath="C:\tmp\" [String]$Servername = "xx040" [String]$actionprefix = "kill_process" [String]$action = $($actionprefix) + "-" [String]$Servicename = "service1" [String]$ServiceFullname = $($action) + $($Servicename) + ".bat" $batchPath = $("`"$scriptpath + $ServiceFullname `"") Invoke-Command -ComputerName $Servername -ScriptBlock { cmd.exe /c "`"$batchPath`"" }
在你的代码中,你不会传入任何东西给你的invoke-command,所以当它远程运行时,它不知道$batchPath
是什么。 看看这个SO回答如何使用Invoke-Command传递命名参数?
Invoke-Command -ComputerName $servername -ScriptBlock {param($batchPath) cmd.exe /c "`"$batchPath`"" } -ArgumentList $batchPath
你是如何打电话的?
只需使用调用操作符 ( &
),并将变量与批处理文件的路径放在双引号中。
& "$batchPath"
您还需要通过using:
scope修饰符在$batchPath
变量$batchPath
已知,否则$batchPath
的$batchPath
将与$batchPath
外部的$batchPath
不同(空)变量。
Invoke-Command -Computer $servername -ScriptBlock { & "$using:batchPath" }
另一种方法是将变量作为参数传递给scriptblock。
Invoke-Command -Computer $servername -ScriptBlock { Param($BatchPath) & "$BatchPath" } -ArgumentList $batchPath
使用Join-Path
来建立路径,所以你不需要自己处理前导/尾随路径分隔符。 此外,PowerShell扩展双引号字符串的变量,让您避免过多的连接。 在单引号的字符串中,变量不能被扩展,所以我通常使用双引号来表示字符串,单引号的字符串没有变量。
修改代码:
$servername = 'xx040' $scriptpath = 'C:\tmp' $actionprefix = 'kill_process' $Servicename = 'service1' $batchPath = Join-Path $scriptpath "$actionprefix-$Servicename.bat" Invoke-Command -ComputerName $servername -ScriptBlock { & "$using:batchPath" }
避免路径中有空格的一种替代方法是使用8.3短符号。
在Windows中打开命令行并使用dir的/x
参数。 要找到程序文件的简称,请使用dir C:\prog* /x
。 这是结果:
21.10.2015 14:46 <DIR> PROGRA~1 Program Files 21.10.2015 12:47 <DIR> PROGRA~2 Program Files (x86) 04.09.2014 18:25 <DIR> PR6AFF~1 Programs16Bit
如果你要解决C:\Program Files
你也可以编写C:\PROGRA~1
。