用path中的空格执行batch file

我有问题通过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