2012-12-05 17 views
29
sceneggiatura

mio PowerShell, Foo.ps1:Come eseguire uno script PowerShell dalla riga di comando e passare una directory come parametro

Function Foo($directory) 
{ 
    echo $directory 
} 

if ($args.Length -eq 0) 
{ 
    echo "Usage: Foo <directory>" 
} 
else 
{ 
    Foo($args[0]) 
} 

Dalla console di Windows:

powershell -command .\Foo.ps1 

risultati in: "Il termine '. \ Foo.ps1' non è riconosciuto come nome di un cmdlet, funzione, file di script o programma eseguibile. Controllare l'ortografia del nome, o se è stato incluso un percorso, verificare che il percorso sia corretto e riprova."

Ciò nonostante, Foo.ps1 si trova nella directory corrente da cui si chiama Powershell. Ho quindi provato a chiamarlo specificando il percorso completo del file di script; perché questo percorso contiene uno spazio credo di doverlo citare in qualche modo. Inoltre ho bisogno di passare un argomento allo script che è anche un nome di file che contiene uno o più spazi. Non importa cosa cerco, non riesco a farlo funzionare. Questa è la mia ipotesi migliore finora:

powershell -command "'C:\Dummy Directory 1\Foo.ps1' 'C:\Dummy Directory 2\File.txt'" 

che dà l'errore "token imprevisto. 'C: \ Dummy Directory 2 \ File.txt' di espressione o l'istruzione alla riga: 1 char: 136".

Edit: ho lavorato perché

powershell -command .\Foo.ps1 

non ha funzionato. Questo era perché il mio file Microsoft.PowerShell_profile.ps1 aveva

cd C: \

quindi non appena PowerShell stava avviando stava cambiando directory.

+1

È inoltre possibile utilizzare -noprofile quando si chiama da PowerShell il cmd. – user467384

risposta

26

provare questo:

powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'" 
+0

@ShellShock Ho modificato la mia risposta per rimuovere il '.' (dot sourcing) perché è inutile in questo caso. –

+1

It; s non funziona: Pls segue il mio ultimo commento su: http://stackoverflow.com/questions/20804065/calling-powershell-function-from-command-line/20804221?noredirect=1#comment48796361_20804221 –

+0

@ ch.smrutiranjanparida Scusa ma non capisco cosa non funziona. Evita commenti per problemi di codifica e pubblica una nuova domanda con informazioni dettagliate sul tuo errore. In bocca al lupo! –

26

si chiama un file di script non un comando quindi bisogna usare -file esempio:

powershell -executionPolicy bypass -noexit -file "c:\temp\test.ps1" "c:\test with space" 

per PS V2

powershell.exe -noexit &'c:\my scripts\test.ps1' 

(controlla il fondo di questa pagina technet http://technet.microsoft.com/en-us/library/ee176949.aspx)

+3

Il primo comando funziona anche in V2. –

+0

grazie per la precisione –

+0

Il Manuale dell'utente di Windows PowerShell 1.0 è stato ritirato. Per il contenuto più aggiornato di Windows PowerShell, visitare https://msdn.microsoft.com/en-au/powershell/scripting/core-powershell/console/powershell.exe-command-line-help#-file -FilePath parametri –

2

modificare il codice al seguente:

Function Foo($directory) 
    { 
     echo $directory 
    } 

    if ($args.Length -eq 0) 
    { 
     echo "Usage: Foo <directory>" 
    } 
    else 
    { 
     Foo([string[]]$args) 
    } 

E poi invocarlo come:

PowerShell -ExecutionPolicy RemoteSigned -File "c: \ foo.ps1" "C: \ Documents e Settings" "c: \ test"

14

Utilizzando la bandiera -Command è possibile eseguire l'intera linea di PowerShell, come se fosse un comando nel prompt dei PowerShell:

powershell -Command "& '<PATH_TO_PS1_FILE>' '<ARG_1>' '<ARG_2>' ... '<ARG_N>'" 

Questo ha risolto il problema con l'esecuzione di comandi PowerShell in eventi Post-Build e Pre-Build di Visual Studio.

2

Aggiungere il declation param nella parte superiore del file di PS1

test.ps1

param(
    # Our preferred encoding 
    [parameter(Mandatory=$false)] 
    [ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")] 
    [string]$Encoding = "UTF8" 
) 

write ("Encoding : {0}" -f $Encoding) 

risultato

C:\temp> .\test.ps1 -Encoding ASCII 
Encoding : ASCII 
Problemi correlati