2013-05-07 16 views
41

Ich bin neu in Powershell und versuche, mir selbst die Grundlagen zu lehren. Ich muss ein ps-Skript schreiben, um eine Datei zu analysieren, was nicht zu schwierig war.Übergabe einer Variablen an ein Powershell-Skript über die Befehlszeile

Jetzt möchte ich es ändern, um eine Variable an das Skript übergeben. Diese Variable wird die Parsing-Zeichenfolge sein. Jetzt ist die Variable immer 1 Wort und nicht ein Satz Wörter oder mehrere Wörter.

Das scheint über einfach zu sein, stellt aber ein Problem für mich. Hier ist meine einfache Code:

$a = Read-Host 
Write-Host $a 

Als ich das Drehbuch von meinem Kommandozeile die Variable Gang laufen nicht funktioniert:

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

Wie Sie sehen können, habe ich versucht, viele methos ohne Erfolg , des Skripts, das den Wert annimmt und ausgibt.

Das Skript wird ausgeführt und wartet auf die Eingabe eines Werts, und wenn ich dies tue, wird der Wert echo.

Ich möchte nur meinen ausgegebenen Wert ausgeben, welche winzige Sache vermisse ich?

Vielen Dank.

+1

Mögliche Duplikat von [Wie Befehlszeilenargumente in PowerShell behandeln] (http://stackoverflow.com/questions/2157554/how-to-handle-command-line-arguments-in-powershell) –

Antwort

38

Hier ist ein gutes Tutorial auf Powershell params:

PowerShell ABC's - P is for Parameters

Grundsätzlich sollten Sie eine param Aussage über die erste Zeile des Skripts verwenden

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

oder die $ args verwenden integrierte Variable, die mit all den args automatisch gefüllt ist .

+1

der Link ist gebrochen –

+0

@MichaelHedgpeth: Es sieht aus wie es ein temporäres Problem war; es ist jetzt wieder da. Ich kenne keine dauerhafte Verbindung für den Artikel. –

+1

Sie haben Recht, danke für die Folge –

54

Machen Sie dies in Ihrem test.ps1, in der ersten Zeile

param(
[string]$a 
) 

Write-Host $a 

Dann können Sie es nennen mit

./Test.ps1 "Here is your text" 

here gefunden

+0

Id nennen Sie es lieber mit ./Test.ps1 -a = "Hier ist Ihr Text", aber das Drucken von $ a wie folgt: -a = Hier ist Ihre Zeichenfolge – ozzy432836

+0

@ ozzy432836 Ich bevorzuge auch diese Syntax, aber es ist nicht eingebaut Power Shell. Ohne ein Leerzeichen sieht PS es als ein einziges unbenanntes Argument. Sie können sicherlich Ihr eigenes Argument Parsing implementieren, aber Sie könnten denken, dass es nicht sein wird, was jemand anderes erwartet.Powershells integrierte Funktionalität ermöglicht benannte und unbenannte (auch positionale) Argumente, obligatorische und optionale Argumente mit Standardwerten und generiert automatisch Hilfe. Das ist eine Menge wegzuwerfen, weil du (& ich) ein '=' über einem Raum vorziehst. Ich habe meine Zeit damit verschwendet, dieses Rad in C neu zu erfinden. Wenige meiner Nutzer könnten mich interessieren. –

5

Deklarieren Sie die Parameter in test.ps1:

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

Führen Sie das Skript aus Lauf oder Windows-Taskplaner:

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

oder

powershell.exe -command "& 'C:\FTP DATA\test.ps1' -input_dir 'C:\FTP DATA\IN' -output_dir 'C:\FTP DATA\OUT'" 
Verwandte Themen