Фоновая работа в Powershell - PullRequest
       13

Фоновая работа в Powershell

7 голосов
/ 04 января 2012

Я пытаюсь запустить задание в фоновом режиме, которое является .exe с параметрами, а в месте назначения есть пробелы. Например:

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

и я хочу запустить это с параметрами:

foo.exe /param1 /param2, etc.

Я знаю, что Start-Job делает это, но я пробовал множество различных комбинаций, и это либо выдает ошибку из-за пробелов, либо из-за параметров. Может кто-нибудь помочь мне с синтаксисом здесь? Мне нужно предположить, что $exec - это путь к исполняемому файлу, потому что он является частью файла конфигурации и может измениться позже.

Ответы [ 2 ]

8 голосов
/ 04 января 2012

Один из способов сделать это - использовать блок сценариев с блоком параметров.

Если в нем есть один аргумент с пробелом, такой как путь к файлу / папке, он долженбыть процитированным, чтобы рассматривать это как отдельный элемент.Аргументы - это массив, передаваемый в блок скрипта.

В этом примере используется блок скрипта, но вы также можете использовать скрипт PowerShell, используя параметр -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
3 голосов
/ 04 января 2012

трюк Энди в целом работает очень хорошо.Если у вас есть наборы параметров или вы хотите переместить сложную информацию в работу, вы также можете попробовать эту технику:

$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

Iобычно используйте оба подхода.

Я использую параметры -ArgumentList / ScriptBlock, когда:

  • Я не имею дело с наборами параметров
  • Я использую In-MemoryЗадание (например, возможность -AsJob в ShowUI или WPK), где аргументы являются реальными объектами, и они не могут умереть
  • Я работаю в пользовательском контексте, где могу выполнить задание, но не могу сохранить вдиск (веб-серверы, лаборатории, совместимые с ISO и т. д.)

Если мне нужны сложные аргументы, и их не нужно передавать в память (или в противном случае удобно размещать их на диске позже),Я буду использовать подход с хэш-таблицей.

Надеюсь, это поможет

...