执行包含路径空格的批处理文件

时间:2015-10-21 13:09:20

标签: windows powershell batch-file cmd

我在通过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`""
}

3 个答案:

答案 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