2012-01-04 96 views
7

我试图在后台运行一个带参数的.exe文件,目标文件中有空格。例如:Powershell中的后台作业

$exec = "C:\Program Files\foo.exe" 

,我想带参数运行此:

foo.exe /param1 /param2, etc. 

我知道Start-Job做到这一点,但我已经尝试吨不同的组合,它要么给我,因为一个错误白色空间或由于参数。有人能帮我解决这个问题吗?我需要假设$exec是可执行文件的路径,因为它是配置文件的一部分,稍后可能会更改。

回答

8

一种方法是使用带有参数块的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 
+0

感谢您的帮助! 2>&1是什么意思? – Brian 2012-01-04 18:55:34

+0

@Brian啊是的,这会将标准错误流(2)重定向到标准输出流(1)。这确保您将从'Receive-Job' cmdlet中接收来自可执行文件的所有文本。通常,我在后台作业中执行的操作是捕获可执行文件“$ out = xcopy $ a $ b 2>&1”的输出,然后检查退出代码('$ LASTEXITCODE')是否非零,如果是,则抛出捕获的文本作为异常消息:'扔$ out'。 – 2012-01-04 19:29:04

3

安迪的伎俩一般工作得很好。如果你有参数集,或以其他方式要复杂的信息移动到工作,你也可以试试这种方法:

$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 /脚本块参数时:

  • 我不是在处理参数设置
  • 我使用一个内存工作(如在显示用户界面和朝鲜劳动党的-AsJob能力),其中论据是真实的对象,
  • 我在那里我可以运行作业的用户上下文中运行他们不能死,但不能存储到磁盘(Web服务器,符合ISO标准的实验室等)

如果我需要补偿lex参数,并且它们不需要在内存中传递(或者以其他方式稍后让它们在磁盘上),我将使用散列表方法。

希望这会有帮助