Passerer rundt kommandolinje $ args i Powershell, fra funksjon til funksjon

stemmer
22

Dette er en ekkel sak jeg møter. Vil ikke bli overrasket om det har en enkel løsning, bare at det er eluding meg.

Jeg har 2 batch-filer som jeg har å konvertere til Powershell script.

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

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

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

På kommandolinjen, jeg benytter denne som C:> file1.bat en to tre Utgangen jeg ser blir som forventet en to tre en to tre

(Dette er en rå kodeeksempel)

Når jeg konvertere til Powershell, jeg har

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] 

Jeg forstår at dette er fordi $ args brukes i file1.ps er en System.Object [] i stedet for 3 strenger.

Jeg trenger en måte å passere $ args mottatt av file1.ps1 til file2.ps1, mye på samme måte som oppnås ved% * i BAT-filer.

Jeg er redd, vil den eksisterende måte bryte selv om det er en cross-funksjon samtale, akkurat slik det er en cross-fil samtalen i mitt eksempel.

Har prøvd noen kombinasjoner, men ingenting fungerer.

Vennligst hjelp. Ville mye pris på det.

Publisert på 20/08/2009 klokken 04:17
kilden bruker
På andre språk...                            


2 svar

stemmer
9
# use the pipe, Luke!

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

file2.ps1
---------
process { write-host $_ }
Svarte 20/08/2009 kl. 05:17
kilden bruker

stemmer
31

I Powershell V2 , er det trivielt med splatting. bar bare blir:

function bar { foo @args }

Splatting vil behandle tabellmedlemmene som individuelle argumenter i stedet for å føre det som en enkelt rekke argument.

I Powershell V1 er det komplisert, det er en måte å gjøre det for posisjon argumenter. Gitt en funksjon foo:

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

Nå kaller det fra bar ved hjelp av Invoke()metoden på scriptblock av foo funksjon

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

Som ser ut som

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

bar args: 1,2,3

args0 1 args1 2 args2 3

når du bruker den.

Svarte 20/08/2009 kl. 05:37
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more