Passer une variable à un script powershell via la ligne de commande

Je suis nouveau à powershell, et j'essaie de m'enseigner les bases. J'ai besoin d'écrire un script ps pour analyser un fichier, ce qui n'a pas été trop difficile.

Maintenant, je veux le changer pour passer une variable au script. cette variable sera la chaîne d'analyse. Maintenant, la variable sera toujours 1 mot, et non un ensemble de mots ou de plusieurs mots.

Cela semble super simple mais pose un problème pour moi. Voici mon code simple:

$a = Read-Host
Write-Host $a

Quand j'exécute le script à partir de ma commande ligne la variable passant ne fonctionne pas:

.test.ps1 hello
.test.ps1 "hello"
.test.ps1 -a "hello"
.test.ps1 -a hello
.test.ps1 -File "hello"

Comme vous pouvez le voir, j'ai essayé beaucoup de méthodes sans succès, du script prenant la valeur une sortie.

Le script s'exécute et attend que je tape une valeur, et quand je le fais, il fait écho à cette valeur.

Je veux juste qu'il affiche ma valeur passée, quelle minuscule chose me manque-t-il?

Je vous Remercie.

46
demandé sur Solaflex 2013-05-07 23:06:45

4 réponses

Voici un bon tutoriel sur les paramètres Powershell:

PowerShell ABC-P est pour les paramètres

Fondamentalement, vous devriez utiliser une instruction param sur la première ligne du script

param([type]$p1 = , [type]$p2 = , ...)

Ou utilisez la variable intégrée $args, qui est automatiquement remplie avec tous les arguments.

43
répondu Brian Stephens 2016-12-20 08:41:34

Faites ceci dans votre test. ps1, à la première ligne

param(
[string]$a
)

Write-Host $a

Alors vous pouvez l'appeler avec

./Test.ps1 "Here is your text"

A ici

58
répondu Solaflex 2013-05-07 19:37:22

Déclarer le paramètre dans test. ps1:

 Param(
                [Parameter(Mandatory=$True,Position=1)]
                [string]$input_dir,
                [Parameter(Mandatory=$True)]
                [string]$output_dir,
                [switch]$force = $false
                )

Exécutez le script à partir du Planificateur de tâches exécuter ou Windows:

powershell.exe -command "& C:\FTP_DATA\test.ps1 -input_dir C:\FTP_DATA\IN -output_dir C:\FTP_DATA\OUT"

Ou

 powershell.exe -command "& 'C:\FTP DATA\test.ps1' -input_dir 'C:\FTP DATA\IN' -output_dir 'C:\FTP DATA\OUT'"
6
répondu Shilpa11 2017-04-07 13:02:03

L'utilisation de param pour nommer les paramètres vous permet d'ignorer l'ordre des paramètres:

ParamEx. ps1

# Show how to handle command line parameters in Windows PowerShell
param(
  [string]$FileName,
  [string]$Bogus
)
write-output 'This is param FileName:'+$FileName
write-output 'This is param Bogus:'+$Bogus

ParaEx.MTD

rem Notice that named params mean the order of params can be ignored
powershell -File .\ParamEx.ps1 -Bogus FooBar -FileName "c:\windows\notepad.exe"
0
répondu mxmoss 2018-07-27 21:19:16