2009-08-18 21 views
72

Per anni ho utilizzato la shell cmd/DOS/Windows e ho inoltrato gli argomenti della riga di comando ai file batch. Ad esempio, ho un file, zuzu.bat e in esso, accesso a %1, %2, ecc. Ora, voglio fare lo stesso quando chiamo uno script PowerShellwhen I am in a Cmd.exe shell. Ho uno script, xuxu.ps1 (e ho aggiunto PS1 alla mia variabile PATHEXT e ai file PS1 associati con PowerShell). Ma non importa quello che faccio, non riesco a ottenere nulla dalla variabile $args. Ha sempre lunghezza 0.Come passare gli argomenti della riga di comando in un file ps1 PowerShell

Se sono in una shell PowerShell, invece di cmd.exe, funziona (ovviamente). Ma non sono ancora abbastanza comodo per vivere a tempo pieno nell'ambiente PowerShell. Non voglio digitare powershell.exe -command xuxu.ps1 p1 p2 p3 p4. Voglio digitare xuxu p1 p2 p3 p4.

E 'possibile, e se sì, come?

Il campione non posso andare al lavoro è banale, foo.ps1:

Write-Host "Num Args:" $args.Length; 
foreach ($arg in $args) { 
    Write-Host "Arg: $arg"; 
} 

I risultati sono sempre così:

C:\temp> foo 
Num Args: 0 
C:\temp> foo a b c d 
Num Args: 0 
c:\temp> 

risposta

16

OK, quindi prima questo è rompere una caratteristica di sicurezza di base in PowerShell. Con questa comprensione, ecco come si può fare:

  1. Aprire una finestra Windows Explorer
  2. Menu Strumenti ->Opzioni cartella -> scheda Tipi di file
  3. Trova il tipo di file PS1 e fare clic sul pulsante avanzate
  4. Fare clic sul pulsante Nuovo
  5. Per Azione messo: Aperto
  6. Per la put di applicazione: "C: \ WINNT \ system32 \ WindowsPowerShell v1.0 \ powershell.exe \" "-file" "% 1" % *

si può decidere di mettere un -NoProfile argomento anche lì a seconda di cosa fa il tuo profilo.

+3

Penso che la chiave è nel vostro passo 6 in cui si passa i parametri al PowerShell .exe. Daniel dice che ha associato i file PS1 con PowerShell ma che non passa gli argomenti senza le specifiche% 1% * in più. Si noti inoltre che il parametro -File non è disponibile in V1. È nuovo per V2. –

+0

Una buona presa riguardo al parametro -file che avevo dimenticato. – EBGreen

+0

Dovrò installare V2 prima di poter provare il tuo suggerimento. Grazie.Quando dici che questo sta infrangendo una funzionalità di sicurezza di base, che cosa significa "questo" intendi? Chiamare uno script PowerShell da Cmd.exe come se fosse un file .com/.bat/.exe? Passando i parametri allo script? –

4

Forse si può avvolgere l'invocazione PowerShell in un file .bat in questo modo:

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

Se poi messo il file in una cartella a vostra PATH, si potrebbe chiamare script PowerShell in questo modo:

ps foo 1 2 3 

Citando può ottenere un po 'disordinato, però:

ps write-host """hello from cmd!""" -foregroundcolor green 
+0

+1 per mostrare le virgolette triple. che mi ha bloccato per un po '. – DeanOC

1

Non si può ottenere "xuxu p1 p2 p3 p4" come sembra.Ma quando si è in PowerShell e si imposta

PS > set-executionpolicy Unrestricted -scope currentuser 

È possibile eseguire quegli script come questo:

./xuxu p1 p2 p3 p4 

o

.\xuxu p1 p2 p3 p4 

o

./xuxu.ps1 p1 p2 p3 p4 

spero che ti rende un po 'più a tuo agio con Powe RSHELL.

26

This article aiuta. In particolare, questa sezione:

-File

Esegue lo script specificato nel ambito locale ("punto di origine"), in modo che le funzioni e le variabili che lo script crea sono disponibili nella sessione corrente . Immettere il percorso del file di script e tutti i parametri. Il file deve essere l'ultimo parametro nel comando, poiché tutti i caratteri digitati dopo il nome del parametro File vengono interpretati come il percorso del file di script seguito dai parametri dello script.

ossia

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

mezzi eseguire il file myfile.ps1 e arg1 arg2 & arg3 sono i parametri per lo script PowerShell.

8

Dichiarare i parametri nel file, ad esempio param ([stringa] $ para1 ....... [stringa] $ param2).

Ora chiamare il file PowerShell come temp.ps1 para1 para2....para10, ecc

11

Dopo aver scavato attraverso la documentazione di PowerShell, ho scoperto alcune informazioni utili su questo problema. Non è possibile utilizzare $args se si è utilizzato lo param(...) all'inizio del file; invece sarà necessario utilizzare $PSBoundParameters. Ho copiato/incollato il codice in uno script PowerShell e ha funzionato come ci si aspetterebbe in PowerShell versione 2 (non sono sicuro della versione in cui si trovava quando si è verificato questo problema).

Se si utilizza $PSBoundParameters (e questo funziona SOLO se si utilizza param(...) all'inizio dello script), quindi non è un array, è una tabella hash, quindi sarà necessario fare riferimento con la chiave/coppia di valori.

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 

E quando viene chiamato con ...

PS> ./foo.ps1 a b c d 

Il risultato è ...

Num Args: 4 
$p1=a $p2=b $p3=c $p4=d 
Problemi correlati