I årevis har jeg brukt cmd/DOS/Windows
shell og gitt kommandolinjeargumenter til batch-filer. Jeg har for eksempel en fil, zuzu.bat
, og i den har jeg tilgang til %1
, %2
osv. Nå vil jeg gjøre det samme når jeg kaller et PowerShell
-skript når jeg er i et Cmd.exe-skall
. Jeg har et skript, xuxu.ps1
(og jeg har lagt til PS1 i PATHEXT-variabelen og knyttet PS1-filer til PowerShell). Men uansett hva jeg gjør, ser det ikke ut til at jeg får noe ut av variabelen $args
. Den har alltid lengden 0.
Hvis jeg er i et PowerShell
-skall, i stedet for cmd.exe
, fungerer det (selvfølgelig). Men jeg er ennå ikke komfortabel nok til å leve i PowerShell-miljøet på heltid. Jeg vil ikke skrive powershell.exe -command xuxu.ps1 p1 p2 p3 p4
. Jeg vil skrive xuxu p1 p2 p3 p4
.
Er dette mulig, og i så fall hvordan?
Eksemplet jeg ikke får til å fungere er trivielt, foo.ps1:
Write-Host "Num Args:" $args.Length;
foreach ($arg in $args) {
Write-Host "Arg: $arg";
}
Resultatene er alltid slik:
C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>
OK, først og fremst er dette å bryte en grunnleggende sikkerhetsfunksjon i PowerShell. Når du har forstått det, kan du se hvordan du gjør det:
Det kan være lurt å legge inn et -NoProfile
-argument der også, avhengig av hva profilen din gjør.
Kanskje du kan pakke inn PowerShell-anropet i en .bat
-fil på denne måten:
rem ps.bat
@echo off
powershell.exe -command "%*"
Hvis du deretter plasserer denne filen under en mappe i PATH
, kan du kalle PowerShell-skript som dette:
ps foo 1 2 3
Det kan imidlertid bli litt rotete å sitere:
ps write-host """hello from cmd!""" -foregroundcolor green
Du får kanskje ikke "xuxu p1 p2 p3 p4" som det ser ut til. Men når du befinner deg i PowerShell og angir
PS > set-executionpolicy Unrestricted -scope currentuser
kan du kjøre disse skriptene slik:
./xuxu p1 p2 p3 p4
eller
.\xuxu p1 p2 p3 p4
eller
./xuxu.ps1 p1 p2 p3 p4
Jeg håper det gjør deg litt mer komfortabel med PowerShell.