我在通过PowerShell在远程服务器上执行批处理文件时遇到问题。用户可以在弹出窗口中选择多个意见,例如 Servername ,开始或查杀进程和 Servicename 。所选项目将保存在变量中。
如果选择了所有项目,我想将字符串合并为一个字符串,并执行名为此结果字符串的批处理脚本。 我尝试按照this post中的描述进行操作,但批处理脚本不会被执行。
示例:
[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`""
}
答案 0 :(得分:1)
在你的代码中,你没有向你的invoke-command传递任何内容,因此当它远程运行时,它不知道$batchPath
是什么。看一下这个SO答案How do I pass named parameters with Invoke-Command?
Invoke-Command -ComputerName $Servername -ScriptBlock {param($batchPath) cmd.exe /c "`"$batchPath`"" } -ArgumentList $batchPath
您是如何打电话的。
答案 1 :(得分:1)
只需使用call operator(&
)并将带有批处理文件路径的变量放在双引号中。
& "$batchPath"
您还需要通过$batchPath
范围修饰符在脚本块中使变量using:
已知,否则脚本块内的$batchPath
将是一个与{{1}不同的(空)变量在scriptblock之外。
$batchPath
另一种方法是将变量作为参数传递给scriptblock:
Invoke-Command -Computer $Servername -ScriptBlock {
& "$using:batchPath"
}
使用Join-Path
构建路径,因此您无需自己处理前导/尾随路径分隔符。此外,PowerShell扩展了双引号字符串中的变量,允许您避免过多的连接。在单引号字符串中,变量不会被展开,所以我通常对字符串使用双引号,对于没有变量的字符串使用单引号。
修改后的代码:
Invoke-Command -Computer $Servername -ScriptBlock {
Param($BatchPath)
& "$BatchPath"
} -ArgumentList $batchPath
答案 2 :(得分:0)
避免使用带空格的路径的另一种方法是使用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
。