Przez lata używałem cmd/DOS/Windows
powłoki i przekazywałem argumenty wiersza poleceń do plików wsadowych. Na przykład, mam pliku, zuzu.bat
aw nim, mam dostęp %1
, %2
itp Teraz chcę zrobić to samo, gdy nazywam PowerShell
skrypt when I am in a Cmd.exe shell
. Mam skrypt xuxu.ps1
(i dodałem PS1 do mojej zmiennej PATHEXT i powiązanych plików PS1 z PowerShell). Ale bez względu na to, co robię, wydaje mi się, że nie mogę nic uzyskać ze $args
zmiennej. Ma zawsze długość 0.
Jeśli jestem w PowerShell
powłoce, zamiast cmd.exe
tego działa (oczywiście). Ale nie czuję się jeszcze wystarczająco komfortowo, aby żyć w środowisku PowerShell w pełnym wymiarze godzin. Nie chcę pisać powershell.exe -command xuxu.ps1 p1 p2 p3 p4
. Chcę pisać xuxu p1 p2 p3 p4
.
Czy to możliwe, a jeśli tak, to w jaki sposób?
Przykład, którego nie mogę uruchomić, jest trywialny, foo.ps1:
Write-Host "Num Args:" $args.Length;
foreach ($arg in $args) {
Write-Host "Arg: $arg";
}
Wyniki są zawsze takie:
C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>
źródło
xuxu p1 p2 p3 p4
”).Po przejrzeniu dokumentacji programu PowerShell odkryłem kilka przydatnych informacji na temat tego problemu. Nie możesz użyć,
$args
jeśli użyłeś theparam(...)
na początku pliku; zamiast tego będziesz musiał użyć$PSBoundParameters
. Skopiowałem / wkleiłem Twój kod do skryptu PowerShell i działał tak, jak można się spodziewać w wersji 2 programu PowerShell (nie jestem pewien, w której wersji byłeś, kiedy napotkasz ten problem).Jeśli używasz
$PSBoundParameters
(i działa to TYLKO, jeśli używaszparam(...)
na początku skryptu), to nie jest to tablica, a tablica mieszająca, więc będziesz musiał odwołać się do niej za pomocą pary klucz / wartość.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
A kiedy dzwonisz z ...
Wynik to...
Num Args: 4 $p1=a $p2=b $p3=c $p4=d
źródło
pwsh .\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4
, to naprawdę nie podoba mi się to. Z drugiej strony, jeśli jestem w PowerShell i robię.\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4
, to działa tak, jak bym się spodziewał. Słyszałem, że tak właśnie ma działać ze względu na „względy bezpieczeństwa”.Powershell>pwsh .\ParamTest.ps1 val1 val2 val3 val4
:Num Args: 4 $p1=val1 $p2=val2 $p3=val3 $p4=val4
param
jest to konstrukcja językowa, jednak musi być pierwszą rzeczą w pliku. Czy wcześniej zadeklarowałeś zmienną lub coś innego? Więcej informacji tutaj: docs.microsoft.com/en-us/powershell/module/…OK, więc najpierw jest to zerwanie podstawowej funkcji zabezpieczeń w programie PowerShell. Mając to na uwadze, oto jak możesz to zrobić:
Możesz
-NoProfile
tam również umieścić argument, w zależności od tego, co robi twój profil.źródło
Możesz zadeklarować swoje parametry w pliku, na przykład param:
[string]$para1 [string]$param2
A następnie wywołaj plik PowerShell w ten sposób
.\temp.ps1 para1 para2....para10
itp.źródło
Może możesz zawinąć wywołanie PowerShell w taki
.bat
plik:rem ps.bat @echo off powershell.exe -command "%*"
Jeśli następnie umieścisz ten plik w folderze w swoim
PATH
, możesz wywołać skrypty PowerShell w ten sposób:Cytowanie może być jednak trochę skomplikowane:
ps write-host """hello from cmd!""" -foregroundcolor green
źródło
Możesz nie otrzymać "xuxu p1 p2 p3 p4", jak się wydaje. Ale kiedy jesteś w PowerShell i ustawiasz
Możesz uruchomić te skrypty w ten sposób:
lub
lub
Mam nadzieję, że dzięki temu poczujesz się trochę bardziej komfortowo z PowerShell.
źródło
jeśli chcesz wywoływać skrypty ps1 z cmd i przekazywać argumenty bez wywoływania takiego skryptu
powershell.exe script.ps1 -c test script -c test ( wont work )
możesz wykonać następujące czynności
setx PATHEXT "%PATHEXT%;.PS1;" /m assoc .ps1=Microsoft.PowerShellScript.1 ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*
To jest przy założeniu, że na Twojej ścieżce znajduje się program powershell.exe
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype
źródło