2010-12-17 5 views
5

I 매개 변수의 수를 필요로하는 스크립트가 : 명령 프롬프트에서파워 쉘 : 작업에 매개 변수를 전달

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

라고 예를 들어,

는 파워 쉘. \ bcpCopy.ps1 -CFROM earn_n_deduct_actg -CTO fin_earn_n_deduct_actg -CCOL f_edeh_doc_id

모든 것이 잘 작동합니다. 그러나 스크립트의 여러 인스턴스를 병렬로 시작해야하며 실제 작업을 수행하는 스크립트를 작성하는 래퍼 스크립트를 작성했습니다. 인수를 사용하여 배열을 준비합니다 ("

# 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 ") anhd 전달할는 작업-시작하는 호출자가 배열을 인쇄하고 그것을 잘 보이는 :

인수 배열 :
를 - CFG
\ ps \ bcpCopyCfgOAH.ps1
(210) -CSYBDB
vnimisro
-CMSDB
IMIS_UNOV
-CFROM
earn_n_deduct_ref
-CTO
fin_earn_n_deduct_ref
- 전체

하지만라는 스크립트의 출력이 수신 유일한 매개 변수는 것을 말한다 구성 파일 - 나머지는 모두 기본값에 있습니다.

PS C : \ PS> 수신 일 1391
2010-12-17 10시 54분 14초 테이블 없음의 업로드를 시작; 소스 db 없음;
12/17/2010 10:54:14 대상 테이블이 없음; 목표 db는 none입니다.
12/17/2010 10:54:14 구성 파일은 \ ps \ bcpCopyCfg.ps1입니다.
12/17/2010 10:54:14 대상 서버 (MS SQL)는 secap900-new입니다.
2010-12-17 10:54:14 원본 데이터베이스를 지정해야합니다. 종료 중 ...

내가 뭘 잘못하고있어?

답변

6

나는 당신이하려는 정확히 잘 모르겠지만, 이것은 잘못된 같습니다 당신은 불필요 완전히 새로운 파워 쉘 프로세스를 만드는

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

. 대신 다음을 시도하십시오 :

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

"@args"구문을 "splatting"이라고합니다. 전달 된 인수를 확장하고 각 요소가 매개 변수로 취급되는지 확인합니다. 앰퍼샌드 (&)는 "호출"연산자입니다.

+0

감사합니다. – Lubo

+0

조언 해 주셔서 감사합니다. 이제 일자리가 풀려나고 아무 것도하지 않는 것처럼 보입니다. 스크립트가 시작되고 인자를 출력 한 직후에도 스크립트에 exit를 넣어 두었던 지 계속 계속합니다. BTW 작업을 시작하는이 방법으로 mngr 작업은 여전히 ​​15 powershell이 ​​처리되었음을 보여줍니다. # 정확히 – Lubo

+0

을 시작했으며 작업을 수동으로 중지 한 후에도 receive-job은 아무 것도 반환하지 않습니다. – Lubo

0

또 다른 방법은 @ 앞에 배열을 넣는 것입니다. $ ARGS 변수를 $ flags로 변경하여 scriptblock의 $ 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 
관련 문제