7

パラメータ付きの .exe であるバックグラウンドでジョブを実行しようとしていますが、宛先にスペースが含まれています。例えば:

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

これをパラメータで実行したい:

foo.exe /param1 /param2, etc.

それがこれを行うことは知ってStart-Jobいますが、さまざまな組み合わせをたくさん試しましたが、空白またはパラメーターが原因でエラーが発生します。誰かがここで構文を手伝ってくれますか? $execこれは構成ファイルの一部であり、後で変更される可能性があるため、実行可能ファイルのパスである と想定する必要があります。

4

2 に答える 2

8

これを行う 1 つの方法は、param ブロックでスクリプト ブロックを使用することです。

ファイル/フォルダー パスなど、スペースを含む引数が 1 つある場合は、単一のアイテムとして扱うために引用符で囲む必要があります。引数は、スクリプト ブロックに渡される配列です。

この例ではスクリプト ブロックを使用していますが、パラメーターの代わりにコマンドレットの-FilePathパラメーターを使用して PowerShell スクリプトを使用することもできます。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
于 2012-01-04T01:51:00.873 に答える
3

Andy のトリックは一般的に非常にうまく機能します。パラメータ セットがある場合、または複雑な情報をジョブに移動したい場合は、次の手法を試すこともできます。

$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 パラメーターを使用します。

  • パラメータセットを扱っていない
  • 引数が実際のオブジェクトであり、死ぬことができないインメモリ ジョブ (ShowUI または WPK の -AsJob 機能など) を使用しています。
  • ジョブを実行できるユーザー コンテキストで実行していますが、ディスクに保存できません (Web サーバー、ISO 準拠のラボなど)。

複雑な引数が必要で、それらをメモリに渡す必要がない場合 (または後でディスク上に置くと便利な場合)、ハッシュテーブル アプローチを使用します。

お役に立てれば

于 2012-01-04T04:36:03.010 に答える