Hvordan passere kommandolinjeargumenter til en Powershell ps1 fil

stemmer
76

I mange år har jeg brukt cmd/DOS/Windowsskallet og bestått kommandolinjeargumenter for å batch-filer. For eksempel har jeg en fil, zuzu.batog i det, jeg tilgang %1, %2etc. Nå ønsker jeg å gjøre det samme når jeg kaller en PowerShellscript when I am in a Cmd.exe shell. Jeg har et manus, xuxu.ps1(og jeg har lagt PS1 til min PATHEXT variabel og tilhørende PS1 filer med Powershell). Men uansett hva jeg gjør, synes jeg ikke å komme noe fra $argsvariabel. Det har alltid lengde 0.

Hvis jeg er i et PowerShellskall, i stedet for cmd.exe, virker det (selvfølgelig). Men jeg er ennå ikke komfortabel nok til å leve i Powershell miljø full tid. Jeg ønsker 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?

Prøven kan jeg ikke få 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>
Publisert på 18/08/2009 klokken 13:37
kilden bruker
På andre språk...                            


7 svar

stemmer
16

OK, så først dette er å bryte en grunnleggende sikkerhetsfunksjon i Powershell. Med denne forståelsen, her er hvordan du kan gjøre det:

  1. Åpne et Windows Explorer -vinduet
  2. Meny Verktøy -> Mappealternativer -> kategorien Filtyper
  3. Finn PS1 filtype og klikk på Avansert-knappen
  4. Klikk på Ny-knappen
  5. For Handling sagt: Åpen
  6. For program put: "C: \ WINNT \ system32 \ Windows Powershell \ v1.0 \ powershell.exe" "-fil" "% 1" % *

Det kan være lurt å sette et -NoProfileargument i det også avhengig av hva profilen din gjør.

Svarte 18/08/2009 kl. 14:10
kilden bruker

stemmer
6

Kanskje du kan pakke inn Powershell påkallelse i en .batfil som så:

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

Hvis du deretter plassert denne filen under en mappe i PATH, kan du ringe Powershell script som dette:

ps foo 1 2 3

Siterer kan bli litt rotete, men:

ps write-host """hello from cmd!""" -foregroundcolor green
Svarte 21/01/2010 kl. 00:19
kilden bruker

stemmer
1

Du kan ikke få "Xuxu p1 p2 p3 p4" som det virker. Men når du er i Powershell, og du angir

PS > set-executionpolicy Unrestricted -scope currentuser

Du kan kjøre disse skriptene som dette:

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

Svarte 27/05/2011 kl. 18:41
kilden bruker

stemmer
27

Denne artikkelen hjelper. Spesielt dette avsnittet:

-Fil

Kjører den angitte scriptet i den lokale omfang ( "dot-hentet"), slik at funksjoner og variabler som skriptet skaper er tilgjengelig i den gjeldende økten. Skriv inn skriptfilen banen og eventuelle parametere. Filen må være den siste parameteren i kommandoen, fordi alle tegn skrevet etter at filen parameternavnet blir tolket som skriptfilen banen etterfulgt av skriptet parametere.

dvs

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

betyr kjøre filen myfile.ps1 og arg1 arg2 & arg3 er parametrene for Powershell script.

Svarte 28/03/2012 kl. 00:35
kilden bruker

stemmer
8

Erklærer parametere i filen, som param ([string] $ para1 ....... [string] $ param2).

Nå kaller Powershell-fil som temp.ps1 para1 para2....para10, etc.

Svarte 24/08/2012 kl. 11:41
kilden bruker

stemmer
13

Etter å grave gjennom Powershell dokumentasjon, oppdaget jeg noe nyttig informasjon om dette problemet. Du kan ikke bruke $argshvis du brukte param(...)på begynnelsen av filen; i stedet må du bruke $PSBoundParameters. Jeg kopiere / limt koden inn i en Powershell script, og det arbeidet som du forventer i Powershell versjon 2 (jeg er ikke sikker på hvilken versjon du var på da du kjørte inn i denne saken).

Hvis du bruker $PSBoundParameters(og dette fungerer bare hvis du bruker param(...)i begynnelsen av skriptet), så er det ikke en matrise, det er en hash table, så du trenger å referere til den ved hjelp av nøkkel / verdi-par.

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

Og når kalt med ...

PS> ./foo.ps1 a b c d

Resultatet er ...

Num Args:  4
$p1=a  $p2=b  $p3=c  $p4=d
Svarte 25/07/2013 kl. 21:24
kilden bruker

stemmer
0

hvis du ønsker å påberope ps1 skript fra cmd og passere argumenter uten å påberope skriptet som

powershell.exe script.ps1 -c test
script -c test ( wont work )

du kan gjøre følgende

setx PATHEXT "%PATHEXT%;.PS1" /m
assoc .ps1=Microsoft.PowerShellScript.1
ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*

Dette er forutsatt powershell.exe er i veien

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype

Svarte 17/06/2019 kl. 05:36
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more