2009-08-20 9 views
22

Jest to nieprzyjemny problem, z którym mam do czynienia. Nie zdziw się, jeśli ma proste rozwiązanie, tylko że mnie umyka.

Mam 2 pliki wsadowe, które muszę przekonwertować na skrypty powershell.

file1.bat 
--------- 

echo %1 
echo %2 
echo %3 
file2.bat %* 

file2.bat 
-------- 
echo %1 
echo %2 
echo %3 

W linii polecenia Przyzywam to jako C:> file1.bat jeden dwa trzy Wyjście widzę jest prawidłowo jeden dwa trzy jeden dwa trzy

(To jest surowa próbka kodu)

Po konwersji na Powershell, mam

file1.ps1 
--------- 
Write-Host "args[0] " $args[0] 
Write-Host "args[1] " $args[1] 
Write-Host "args[2] " $args[2] 
. ./file2.ps1 $args 

file2.ps1 
--------- 
Write-Host "args[0] " $args[0] 
Write-Host "args[1] " $args[1] 
Write-Host "args[2] " $args[2] 

When I invoke this on powershell command line, I get 
$> & file1.ps1 one two three 
args[0] one 
args[1] two 
args[2] three 
args[0] one two three 
args[1] 
args[2] 

Rozumiem, że to dlatego, że $ args użyte w file1.ps to System.Object [] zamiast 3 ciągów.

Potrzebuję sposobu przekazania $ args odebranych przez plik1.ps1 do pliku2.ps1, podobnie jak w plikach .bat.

Obawiam się, że istniejący sposób postępowania zostanie przerwany, nawet jeśli jest to wywołanie funkcji krzyżowej, tak jak jest to wywołanie cross-file w moim przykładzie.

Próbowałem kilku kombinacji, ale nic nie działa.

Uprzejmy pomoc. Bardzo to doceniam.

Odpowiedz

8
# use the pipe, Luke! 

file1.ps1 
--------- 
$args | write-host 
$args | .\file2.ps1  

file2.ps1 
--------- 
process { write-host $_ } 
31

W PowerShell V2, to banalny z splatting. pasek staje się:

function bar { foo @args } 

Splatting traktuje elementy tablicy jako indywidualne argumenty, zamiast podawać je jako pojedynczy argument tablicowy.

W PowerShell V1 jest skomplikowany, jest sposób, aby zrobić to dla argumentów pozycyjnych. Biorąc foo funkcję:

function foo { write-host args0 $args[0] args1 $args[1] args2 $args[2] } 

Teraz wywołać ją z baru przy użyciu metody Invoke() na scriptblock funkcji foo

function bar { $OFS=','; "bar args: $args"; $function:foo.Invoke($args) } 

który wygląda jak

 
PS (STA) (16) > bar 1 2 3 

bar args: 1,2,3 

args0 1 args1 2 args2 3 

kiedy go używać.

Powiązane problemy