web-dev-qa-db-fra.com

Passer la ligne de commande $ args dans powershell, de fonction en fonction

C'est un problème désagréable auquel je suis confronté. Je ne serai pas surpris s'il a une solution simple, juste que cela m'échappe.

J'ai 2 fichiers batch que je dois convertir en scripts PowerShell.

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

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

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

Sur la ligne de commande, j'appelle ceci comme C:> file1.bat un deux trois La sortie que je vois est comme prévu un deux trois un deux trois

(Ceci est un exemple de code brut)

Lorsque je me convertis à Powershell, j'ai

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] 

Je comprends que c'est parce que $ args utilisé dans file1.ps est un System.Object [] au lieu de 3 chaînes.

J'ai besoin d'un moyen de transmettre les $ args reçus par file1.ps1 à file2.ps1, de la même manière que celle obtenue par% * dans les fichiers .bat.

J'ai peur, la manière existante se cassera même si c'est un appel inter-fonctions, tout comme son appel inter-fichiers dans mon exemple.

J'ai essayé quelques combinaisons, mais rien ne fonctionne.

Aide aimablement. Je l'apprécierais beaucoup.

25
Bhavesh Kotak

Dans PowerShell V2, c'est trivial avec les éclaboussures. bar devient juste:

function bar { foo @args }

Le fractionnement traitera les membres du tableau comme des arguments individuels au lieu de le passer comme un seul argument du tableau.

Dans PowerShell V1 c'est compliqué, il y a un moyen de le faire pour les arguments positionnels. Étant donné une fonction foo:

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

Maintenant, appelez-le depuis la barre en utilisant la méthode Invoke() sur le bloc de script de la fonction foo

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

Qui ressemble

 PS (STA) (16)> barre 1 2 3 
 
 Barre args: 1,2,3 
 
 Args0 1 args1 2 args2 3 

lorsque vous l'utilisez.

37
Bruce Payette
# use the pipe, Luke!

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

file2.ps1
---------
process { write-Host $_ }
9
Richard Berg