2010-12-17 17 views
5

Mam skrypt, który wymaga wielu parametrów:PowerShell: przekazywanie parametrów do pracy

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") 

gdy wywoływana z poziomu wiersza poleceń, np

PowerShell. \ BcpCopy.ps1 -CFROM earn_n_deduct_actg -CTO fin_earn_n_deduct_actg -CCOL f_edeh_doc_id

wszystko działa poprawnie. Muszę jednak uruchomić równolegle kilka (kilkadziesiąt) wystąpień skryptu i napisałem skrypt otoki, który wywołuje wykonującego rzeczywistą pracę jako zadanie: Przygotowuję tablicę z argumentami (włączając słowa kluczowe takie jak " -cfg ") anhd przekazać go do uruchomienia zadania:

# 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 

Niestety, nazywany skrypt nie odbiera argumenty: dzwoniący drukuje tablicę i wygląda dobrze: tablicę

Argument:
- CFG
\ ps \ bcpCopyCfgOAH.ps1
-CSYBDB
vnimisro
-CMSDB
IMIS_UNOV
-CFROM
earn_n_deduct_ref
-CTO
fin_earn_n_deduct_ref
-full

ale wyjście z zwane skrypty mówi, że jedynym parametrem jest otrzymana plik konfiguracyjny - cała reszta ma domyślne wartości.

PS C: \ ps> otrzymywać-job 1391
12/17/2010 10:54:14 Uruchamianie przesyłanie tabeli równych; źródło db brak;
17.12.2010 10:54:14 Tabela docelowa to żadna; docelowy db to brak;
12/17/2010 10:54:14 Plik konfiguracyjny to \ ps \ bcpCopyCfg.ps1.
17.12.2010 10:54:14 Docelowy serwer (MS SQL) to secap900-nowy
12/17/2010 10:54:14 Należy podać źródłową bazę danych. Wychodząc z ...

Czy możesz wskazać mi, co robię źle?

Odpowiedz

6

Nie jestem pewien, co dokładnie próbujesz zrobić, ale to wygląda źle:

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

Tworzycie zupełnie nowy proces powershell niepotrzebnie. Zamiast tego spróbuj tego:

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

Składnia "@args" nazywa się "splatting". Spowoduje to rozwinięcie przekazanych argumentów i sprawdzenie, czy każdy element jest traktowany jako parametr. Znak ampersand (&) jest operatorem "połączenia".

+0

Dziękuję za radę. – Lubo

+0

Dzięki za poradę. Teraz prace są zwolnione i wydają się wieszać, nie robiąc nic. Kontynuuj, aby zawiesić nawet umieścić wyjście w skrypcie zaraz po uruchomieniu i wypisuje argumenty. Przy okazji tego sposobu uruchamiania zadań, zadanie mngr nadal pokazuje 15 przetworzonych powłok - dokładnie # Zacząłem – Lubo

+0

, a także po ręcznym zatrzymaniu zadań, odbiór-praca nie zwraca niczego – Lubo

0

Innym sposobem jest umieszczenie znaku @ przed tablicą. Zmieniono zmienną $ ARGS na $ flags, aby odróżnić $ args w skrypcie od flag $.

$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 
Powiązane problemy