我正在尝试在后台运行作业,该作业是带有参数的 .exe,并且目标位置有空格。例如:
$exec = "C:\Program Files\foo.exe"
我想用参数运行它:
foo.exe /param1 /param2, etc.
我知道这样Start-Job
做,但我尝试了很多不同的组合,它要么因为空白,要么因为参数而给我一个错误。有人可以帮我解决这里的语法吗?我需要假设这$exec
是可执行文件的路径,因为它是配置文件的一部分,以后可能会更改。
我正在尝试在后台运行作业,该作业是带有参数的 .exe,并且目标位置有空格。例如:
$exec = "C:\Program Files\foo.exe"
我想用参数运行它:
foo.exe /param1 /param2, etc.
我知道这样Start-Job
做,但我尝试了很多不同的组合,它要么因为空白,要么因为参数而给我一个错误。有人可以帮我解决这里的语法吗?我需要假设这$exec
是可执行文件的路径,因为它是配置文件的一部分,以后可能会更改。
一种方法是使用带有参数块的脚本块。
如果有一个带有空格的参数,例如文件/文件夹路径,则应将其引用以将其视为单个项目。参数是传递给脚本块的数组。
此示例使用脚本块,但您也可以使用 PowerShell 脚本,使用cmdlet 的-FilePath
参数Start-Job
而不是-ScriptBlock
参数。
这是另一个带有空格参数的示例:
$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 / ScriptBlock 参数:
如果我需要复杂的参数,并且不需要在内存中传递它们(或者稍后将它们放在磁盘上很方便),我将使用哈希表方法。
希望这可以帮助