Powershell: передача параметров на работу - PullRequest
5 голосов
/ 17 декабря 2010

У меня есть сценарий, которому требуется ряд параметров:

param ([string]$FOO="foo",[string]$CFG='\ps\bcpCopyCfg.ps1', [string]$CFROM="none", `
[string]$CTO="none", [switch]$HELP=$FALSE, [switch]$FULL=$FALSE, [string]$CCOL="none" `
,[string]$CDSQUERY="none", [string]$CMSSRV="none" `
,[string]$CSYBDB="none", [string]$CMSDB="none")

при вызове из командной строки, например

powershell. \ BcpCopy.ps1 -CFROM earn_n_deduct_actg -CTOfin_earn_n_deduct_actg -CCOL f_edeh_doc_id

все работает отлично.Однако мне нужно запустить несколько (десятки) экземпляров сценария параллельно, и я написал сценарий-обертку, который вызывает тот, который выполняет реальную работу, как задание: я готовлю массив с аргументами (включая ключевые слова, такие как «-CFG»).") anhd передает его в start-job:

    # Prepare script block to be released
    $ARGS=("-CFG ", $CFG, "-CSYBDB ", $SYBDB, "-CMSDB ",$MSDB, "-CFROM ", $SYBTBL, "-CTO ",$MSTBL)
    if ($FULL) {
        $ARGS = $ARGS + " -FULL"
    } else { 
        $ARGS = $ARGS + " -CCOL $($args[5])  "
    } 
    "Argument array:"
    $ARGS

    start-job  -scriptblock {powershell.exe -file '\ps\bcpCopy.ps1'} -ArgumentList $ARGS

К сожалению, вызываемый скрипт не получает аргументы: вызывающая сторона печатает массив и выглядит нормально:

Массив аргументов:
-CFG
\ ps \ bcpCopyCfgOAH.ps1
-CSYBDB
ВНИМИСРО
-CMSDB
IMIS_UNOV
-CFROM
заработать_n_deduct_ref * 1023_с__ц1025 * -FULL

, но вывод из вызываемых сценариев говорит, что единственный полученный параметр - это файл конфигурации - все остальные имеют значения по умолчанию.

PS C:\ ps> receive-job 1391
17.12.2010 10:54:14 Начало загрузки таблицы none;source db none;
17.12.2010 10:54:14 Целевая таблица отсутствует;целевая база данных - нет;
17.12.2010 10:54:14 Файл конфигурации: \ ps \ bcpCopyCfg.ps1.
17.12.2010 10:54:14 Целевой сервер (MS SQL) - secap900-new
17.12.2010 10:54:14 Необходимо указать исходную базу данных.Выход ...

Подскажите, пожалуйста, что я делаю не так?

Ответы [ 2 ]

6 голосов
/ 17 декабря 2010

Я не уверен, что именно вы пытаетесь сделать, но это выглядит неправильно:

start-job  -scriptblock {
    powershell.exe -file '\ps\bcpCopy.ps1'} -ArgumentList $ARGS

Вы создаете совершенно новый процесс PowerShell без необходимости.Попробуйте вместо этого:

start-job  -scriptblock {
    & 'c:\ps\bcpCopy.ps1' @args } -ArgumentList $ARGS

Синтаксис "@args" называется "splatting".Это расширит переданные аргументы и обеспечит обработку каждого элемента как параметра.Амперсанд (&) - это оператор вызова.

0 голосов
/ 10 января 2014

Другой способ - поместить @ перед массивом. Я изменил переменную $ ARGS на $ flags, чтобы отличить $ args в блоке скрипта от $ flags.

$flags = @("-CFG ", $CFG, "-CSYBDB ", $SYBDB, "-CMSDB ",$MSDB, "-CFROM ", $SYBTBL, "-CTO ",$MSTBL)

If($FULL) {
    $flags = $flags + " -FULL"
}
Else {
   $flags = $flags + " -CCOL $($args[5])  "
}
"Argument array:"
$flags

start-job  -scriptblock {powershell.exe -file '\ps\bcpCopy.ps1' $args} -ArgumentList $flags
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...