Seit Jahren verwende ich die cmd/DOS/Windows
-Shell und übergebe Befehlszeilenargumente an Batch-Dateien. Ich habe zum Beispiel eine Datei "zuzu.bat", in der ich auf "%1", "%2" usw. zugreife. Nun möchte ich dasselbe tun, wenn ich ein PowerShell-Skript aufrufe, wenn ich mich in einer Cmd.exe-Shell befinde. Ich habe ein Skript, xuxu.ps1
(und ich habe PS1 zu meiner PATHEXT-Variable hinzugefügt und PS1-Dateien mit PowerShell verknüpft). Aber egal, was ich tue, ich scheine nicht in der Lage zu sein, irgendetwas von der Variable $args
zu erhalten. Sie hat immer die Länge 0.
Wenn ich mich in einer "PowerShell"-Shell befinde, anstatt in "cmd.exe", funktioniert es (natürlich). Aber ich fühle mich noch nicht wohl genug, um Vollzeit in der PowerShell-Umgebung 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 dies möglich, und wenn ja, wie?
Das Beispiel, das ich nicht zum Laufen bringen 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:
C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>
OK, zunächst einmal wird damit eine grundlegende Sicherheitsfunktion in PowerShell verletzt. Mit diesem Verständnis, hier ist, wie Sie es tun können:
Je nachdem, was Ihr Profil macht, sollten Sie dort auch ein "NoProfile"-Argument einfügen.
Vielleicht können Sie den PowerShell-Aufruf in eine "bat"-Datei wie folgt verpacken:
rem ps.bat
@echo off
powershell.exe -command "%*"
Wenn Sie diese Datei dann in einem Ordner in Ihrem PATH
ablegen, können Sie PowerShell-Skripte wie folgt aufrufen:
ps foo 1 2 3
Das Zitieren kann allerdings ein wenig unübersichtlich werden:
ps write-host """hello from cmd!""" -foregroundcolor green
Sie erhalten möglicherweise nicht "xuxu p1 p2 p3 p4", wie es scheint. Aber wenn Sie in PowerShell sind und
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 jetzt etwas besser mit PowerShell auskennen.