Seit Jahren verwende ich die cmd/DOS/Windows
Shell und übergebe Befehlszeilenargumente an Batchdateien. Zum Beispiel habe ich eine Datei, zuzu.bat
und in ihm, ich Zugang %1
, %2
usw. Nun mag ich das gleiche tun , wenn ich einen Anruf PowerShell
Skript when I am in a Cmd.exe shell
. Ich habe ein Skript xuxu.ps1
(und ich habe meiner PATHEXT-Variablen und den mit PowerShell verknüpften PS1-Dateien PS1 hinzugefügt). Aber egal was ich mache, ich scheine nichts von der $args
Variablen zu bekommen . Es hat immer die Länge 0.
Wenn ich in einer PowerShell
Shell bin cmd.exe
, funktioniert es (natürlich). Aber ich bin noch nicht bequem genug, um ganztägig in der PowerShell-Umgebung 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?
Das Beispiel, das ich nicht zur Arbeit bringen 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>
quelle
xuxu p1 p2 p3 p4
").OK, zunächst wird damit eine grundlegende Sicherheitsfunktion in PowerShell verletzt. Mit diesem Verständnis können Sie Folgendes tun:
Möglicherweise möchten Sie
-NoProfile
dort auch ein Argument einfügen, je nachdem, was Ihr Profil tut.quelle
Nachdem ich die PowerShell-Dokumentation durchgesehen hatte, entdeckte ich einige nützliche Informationen zu diesem Problem. Sie können das nicht verwenden,
$args
wenn Sie dasparam(...)
am Anfang Ihrer Datei verwendet haben. stattdessen müssen Sie verwenden$PSBoundParameters
. Ich habe Ihren Code in ein PowerShell-Skript kopiert / eingefügt und es hat wie erwartet in PowerShell Version 2 funktioniert (ich bin nicht sicher, auf welcher Version Sie waren, als Sie auf dieses Problem gestoßen sind).Wenn Sie verwenden
$PSBoundParameters
(und dies funktioniert NUR, wenn Sie esparam(...)
am Anfang Ihres Skripts verwenden), handelt es sich nicht um ein Array, sondern um eine Hash-Tabelle. Sie müssen also mit dem Schlüssel / Wert-Paar darauf verweisen.Und wenn mit ...
Das Ergebnis ist...
quelle
pwsh .\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4
es das wirklich nicht. Wenn ich dagegen in PowerShell bin und dies tue.\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4
, funktioniert das wie erwartet. Ich habe gehört, dass dies aus "Sicherheitsgründen" so funktionieren soll.Powershell>pwsh .\ParamTest.ps1 val1 val2 val3 val4
liefern: Ausbeuten:Num Args: 4 $p1=val1 $p2=val2 $p3=val3 $p4=val4
param
ist ein Sprachkonstrukt, aber es muss das erste sein, was in der Datei enthalten ist. Haben Sie zuvor eine Variable oder etwas anderes deklariert? Weitere Informationen hier: docs.microsoft.com/en-us/powershell/module/…Sie können Ihre Parameter in der Datei wie deklarieren:
Rufen Sie dann die PowerShell-Datei wie folgt auf
.\temp.ps1 para1 para2....para10
usw.quelle
$para1
ein reserviertes Wort?Vielleicht können Sie den PowerShell-Aufruf in eine
.bat
Datei wie folgt einschließen :Wenn Sie diese Datei dann unter einem Ordner in Ihrem Ordner ablegen
PATH
, können Sie PowerShell-Skripts wie folgt aufrufen:Das Zitieren kann jedoch etwas chaotisch werden:
quelle
Möglicherweise erhalten Sie nicht "xuxu p1 p2 p3 p4", wie es scheint. Aber wenn Sie in PowerShell sind und festlegen
Sie können diese Skripte folgendermaßen ausführen:
oder
oder
Ich hoffe, das macht Sie ein bisschen komfortabler mit PowerShell.
quelle
Wenn Sie ps1-Skripte von cmd aus aufrufen und Argumente übergeben möchten, ohne das Skript wie aufzurufen
Sie können Folgendes tun
Dies setzt voraus, dass sich Powershell.exe auf Ihrem Weg befindet
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype
quelle