我试图在后台运行一个带参数的.exe文件,目标文件中有空格。例如:Powershell中的后台作业
$exec = "C:\Program Files\foo.exe"
,我想带参数运行此:
foo.exe /param1 /param2, etc.
我知道Start-Job
做到这一点,但我已经尝试吨不同的组合,它要么给我,因为一个错误白色空间或由于参数。有人能帮我解决这个问题吗?我需要假设$exec
是可执行文件的路径,因为它是配置文件的一部分,稍后可能会更改。
我试图在后台运行一个带参数的.exe文件,目标文件中有空格。例如:Powershell中的后台作业
$exec = "C:\Program Files\foo.exe"
,我想带参数运行此:
foo.exe /param1 /param2, etc.
我知道Start-Job
做到这一点,但我已经尝试吨不同的组合,它要么给我,因为一个错误白色空间或由于参数。有人能帮我解决这个问题吗?我需要假设$exec
是可执行文件的路径,因为它是配置文件的一部分,稍后可能会更改。
一种方法是使用带有参数块的script block。
如果只有一个带有空格的参数,例如文件/文件夹路径,则应将其引用为单个项目。参数是一个传递给脚本块的数组。
本示例使用脚本块,但您也可以使用cmdlet的-FilePath
参数而不是-ScriptBlock
参数使用PowerShell脚本。
这里是具有与空间参数另一个例子:
$scriptBlock = {
param (
[string] $Source,
[string] $Destination
)
$output = & xcopy $Source $Destination 2>&1
return $output
}
$job = Start-Job -scriptblock $scriptBlock -ArgumentList 'C:\My Folder', 'C:\My Folder 2'
Wait-Job $job
Receive-Job $job
下面是使用一个例子$args
内置变量代替param
块。
$scriptBlock = {
$output = & xcopy $args 2>&1
return $output
}
$path1 = "C:\My Folder"
$path2 = "C:\My Folder 2"
"hello world" | Out-File -FilePath "$path1\file.txt"
$job = Start-Job -scriptblock $scriptBlock -ArgumentList $path1, $path2
Wait-Job $job
Receive-Job $job
安迪的伎俩一般工作得很好。如果你有参数集,或以其他方式要复杂的信息移动到工作,你也可以试试这种方法:
$jobArgs = @{Source="foo"; Destination="bar"}
$jobArgs |Export-CliXml -Path $env:\Temp\MyArgs.clixml
,并在工作...
Start-Job {
.... $jobArgs = Import-CliXml -Path $env:\Temp\MyArgs.clixml
} | Wait-Job | Receive-Job
我用这两种方法通常。
我用-ArgumentList /脚本块参数时:
如果我需要补偿lex参数,并且它们不需要在内存中传递(或者以其他方式稍后让它们在磁盘上),我将使用散列表方法。
希望这会有帮助
感谢您的帮助! 2>&1是什么意思? – Brian 2012-01-04 18:55:34
@Brian啊是的,这会将标准错误流(2)重定向到标准输出流(1)。这确保您将从'Receive-Job' cmdlet中接收来自可执行文件的所有文本。通常,我在后台作业中执行的操作是捕获可执行文件“$ out = xcopy $ a $ b 2>&1”的输出,然后检查退出代码('$ LASTEXITCODE')是否非零,如果是,则抛出捕获的文本作为异常消息:'扔$ out'。 – 2012-01-04 19:29:04