2009-08-18 27 views
72

Seit Jahren habe ich die Shell cmd/DOS/Windows verwendet und Befehlszeilenargumente an Batchdateien übergeben. Zum Beispiel habe ich eine Datei, zuzu.bat und darin, ich greife auf %1, %2, etc. Nun möchte ich das gleiche tun, wenn ich ein PowerShell Skript when I am in a Cmd.exe shell aufrufen. Ich habe ein Skript, xuxu.ps1 (und ich habe PS1 zu meiner PATHEXT-Variable hinzugefügt und verknüpfte PS1-Dateien mit PowerShell). Aber egal, was ich tue, ich kann anscheinend nichts von der Variablen $args bekommen. Es hat immer die Länge 0.So übergeben Sie Befehlszeilenargumente an eine PowerShell ps1-Datei

Wenn ich in einer Shell PowerShell statt cmd.exe bin, funktioniert es (natürlich). Aber ich bin noch nicht komfortabel genug, um in der PowerShell-Umgebung in Vollzeit zu leben. Ich möchte nicht powershell.exe -command xuxu.ps1 p1 p2 p3 p4 eingeben. Ich möchte xuxu p1 p2 p3 p4 eingeben.

Ist das möglich, und wenn ja, wie?

Die Probe ich nicht zur Arbeit bekommen kann, ist trivial, foo.ps1:

Write-Host "Num Args:" $args.Length; 
foreach ($arg in $args) { 
    Write-Host "Arg: $arg"; 
} 

Die Ergebnisse sind immer wie folgt aus:

C:\temp> foo 
Num Args: 0 
C:\temp> foo a b c d 
Num Args: 0 
c:\temp> 

Antwort

16

OK, also zuerst Dies ist eine grundlegende Sicherheitsmerkmal zu brechen in der PowerShell. Mit diesem Verständnis ist hier, wie Sie es tun können:

  1. Öffnen ein Windows Explorer Fenster
  2. Menü Werkzeuge ->Ordneroptionen -> Tab Dateitypen
  3. Finden Sie den PS1 Dateityp und klicken Sie auf die erweiterte Schaltfläche
  4. Klicken Sie auf die Schaltfläche Neu
  5. Für Aktion setzen: Öffnen
  6. Für die Anwendung Put: "C: \ winnt \ system32 \ Windows \ v1.0 \ powershell.exe" "-Datei" "% 1" % *

Möglicherweise möchten Sie ein setzen -NoProfile Argument auch dort hängt davon ab, was Ihr Profil tut.

+3

Ich denke, der Schlüssel in Ihrem Schritt 6, wo Sie in den Parametern zu Powershell passieren .exe. Daniel sagt, dass er PS1-Dateien mit PowerShell verknüpft hat, aber Argumente ohne die zusätzlichen% 1% * - Spezifikationen nicht übergibt. Beachten Sie auch, dass der Parameter "Datei" in V1 nicht verfügbar ist. Es ist neu in V2. –

+0

Guter Fang bezüglich des Parameters -file hatte ich vergessen. – EBGreen

+0

Ich muss V2 installieren, bevor ich Ihren Vorschlag ausprobieren kann. Vielen Dank.Wenn du sagst, dass dies ein grundlegendes Sicherheitsmerkmal durchbricht, was meinst du "dieses"? Ein PowerShell-Skript von Cmd.exe aufrufen, als wäre es eine .com/.bat/.exe-Datei? Parameter an das Skript übergeben? –

4

Vielleicht können Sie die Powershell-Aufruf in einer .bat Datei wie so wickeln:

rem ps.bat 
@echo off 
powershell.exe -command "%*" 

Wenn Sie dann diese Datei in einem Ordner in Ihrem PATH platziert, Sie Powershell-Skripts wie folgt aufrufen können:

ps foo 1 2 3 

Zitiert kann ein wenig chaotisch, aber:

ps write-host """hello from cmd!""" -foregroundcolor green 
+0

+1 für die dreifachen Anführungszeichen. Das hat mich für eine Weile festgehalten. – DeanOC

1

Sie können nicht "xuxu p1 p2 p3 p4" erhalten, wie es scheint.Aber wenn Sie in Powershell sind und Sie setzen

PS > set-executionpolicy Unrestricted -scope currentuser 

Sie können diese Skripte wie folgt ausführen:

./xuxu p1 p2 p3 p4 

oder

.\xuxu p1 p2 p3 p4 

oder

./xuxu.ps1 p1 p2 p3 p4 

Ich hoffe, dass macht dich mit Powe ein bisschen gemütlicher rShell.

26

This article hilft. Insbesondere in diesem Abschnitt:

-File

Führt das angegebene Skript im lokalen Bereich („dot-sourced“), so dass die Funktionen und Variablen, dass das Skript in der aktuellen Sitzung zur Verfügung erstellt . Geben Sie den Skriptdateipfad und alle Parameter ein. Datei muss der letzte Parameter im Befehl sein, da alle nach dem Dateiparameternamen eingegebenen Zeichen als Skriptdateipfad gefolgt von den Skriptparametern interpretiert werden.

heißt

powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3 

Mittel, um die Datei myfile.ps1 und arg1 arg2 & arg3 laufen, sind die Parameter für das Skript Powershell.

8

Deklarieren Sie Ihre Parameter in der Datei wie param ([string] $ para1 ....... [string] $ param2).

nun die Powershell-Datei wie temp.ps1 para1 para2....para10 nennen usw.

11

Nachdem durch die Powershell-Dokumentation zu graben, entdeckte ich einige nützliche Informationen zu diesem Thema. Sie können $args nicht verwenden, wenn Sie am Anfang der Datei param(...) verwendet haben; Stattdessen müssen Sie $PSBoundParameters verwenden. Ich habe Ihren Code in ein PowerShell-Skript kopiert/eingefügt, und es funktionierte wie erwartet in PowerShell Version 2 (ich bin mir nicht sicher, in welcher Version Sie waren, als Sie auf dieses Problem stießen).

Wenn Sie verwenden (und dies funktioniert nur, wenn Sie param(...) am Anfang Ihres Skripts verwenden), dann ist es kein Array, es ist eine Hashtabelle, Sie müssen also mit dem Schlüssel darauf verweisen/Wertpaar.

param($p1, $p2, $p3, $p4) 
$Script:args="" 
write-host "Num Args: " $PSBoundParameters.Keys.Count 
foreach ($key in $PSBoundParameters.keys) { 
    $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + " " 
} 
write-host $Script:args 

Und wenn callte mit ...

PS> ./foo.ps1 a b c d 

Das Ergebnis ist ...

Num Args: 4 
$p1=a $p2=b $p3=c $p4=d 
Verwandte Themen