Frage Übergeben von Befehlszeilenargumenten an eine PowerShell ps1-Datei


Seit Jahren habe ich die cmd/DOS/Windows Shell und übergeben Befehlszeilenargumente an Batch-Dateien. Zum Beispiel habe ich eine Datei, zuzu.bat und darauf greife ich zu %1, %2usw. Jetzt möchte ich dasselbe tun, wenn ich ein anrufe PowerShell Skript when I am in a Cmd.exe shell. 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 scheine nicht in der Lage zu sein, etwas von der $args Variable. Es hat immer die Länge 0.

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

Ist das möglich und wenn ja, wie?

Die Probe, die 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 so:

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

76
2017-08-18 13:37


Ursprung


Antworten:


Dieser Artikel hilft. Insbesondere dieser Abschnitt:

-Datei

Führt das angegebene Skript im lokalen Bereich ("dot-sourced") aus, sodass die vom Skript erstellten Funktionen und Variablen in der aktuellen Sitzung verfügbar sind. 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.

d.h.

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

bedeutet, dass die Datei myfile.ps1 und arg1 arg2 & arg3 die Parameter für das PowerShell-Skript sind.


27
2018-03-28 00:35



OK, zuerst bricht dies eine grundlegende Sicherheitsfunktion in PowerShell. Mit diesem Verständnis können Sie Folgendes tun:

  1. Öffnen Sie ein Windows Explorer Fenster
  2. Speisekarte Werkzeuge -> Ordneroptionen -> Registerkarte Datentypen
  3. Suchen Sie den Dateityp PS1 und klicken Sie auf die Schaltfläche Erweitert
  4. Klicken Sie auf die Schaltfläche Neu
  5. Für Aktion setzen: Öffnen
  6. Für die Anwendung legte: "C: \ WINNT \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-datei" "% 1"% *

Vielleicht möchten Sie ein -NoProfile Argument dort auch abhängig davon, was Ihr Profil tut.


16
2017-08-18 14:10



Nach dem Durchsuchen der PowerShell-Dokumentation habe ich einige nützliche Informationen zu diesem Problem gefunden. Du kannst das nicht benutzen $args wenn du den benutzt hast param(...) am Anfang Ihrer Datei; stattdessen müssen Sie verwenden $PSBoundParameters. 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 $PSBoundParameters (und das funktioniert nur, wenn Sie verwenden param(...) am Anfang Ihres Skripts), dann ist es kein Array, es ist eine Hash-Tabelle, daher müssen Sie sie mit dem Schlüssel / Wert-Paar referenzieren.

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 mit ...

PS> ./foo.ps1 a b c d

Das Ergebnis ist...

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

13
2017-07-25 21:24



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

Rufen Sie jetzt die PowerShell-Datei auf temp.ps1 para1 para2....para10, etc.


8
2017-08-24 11:41



Vielleicht können Sie den PowerShell-Aufruf in ein .batDatei so:

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

Wenn Sie diese Datei dann in einem Ordner in Ihrem Ordner abgelegt haben PATH, könnten Sie PowerShell-Skripte wie folgt aufrufen:

ps foo 1 2 3

Zitieren kann jedoch ein wenig unordentlich werden:

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

6
2018-01-21 00:19



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

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 Sie sich mit PowerShell ein wenig wohler fühlen.


1
2018-05-27 18:41