2012-12-05 10 views
29

My PowerShell skryptu Foo.ps1:Jak uruchomić skrypt PowerShell z wiersza poleceń i przejść do katalogu jako parametr

Function Foo($directory) 
{ 
    echo $directory 
} 

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

Z konsoli systemu Windows:

powershell -command .\Foo.ps1 

Wyniki w: "Nazwa". \ Foo.ps1 "nie jest rozpoznawana jako nazwa polecenia cmdlet, funkcji, pliku skryptu lub obsługiwanego programu. Sprawdź pisownię nazwy lub jeśli ścieżka została uwzględniona, sprawdź, czy ścieżka jest poprawna i Spróbuj ponownie."

Jest to pomimo, że Foo.ps1 jest w bieżącym katalogu, skąd wywoływam Powershell. Próbowałem wtedy nazwać ją pełną ścieżką do pliku skryptu; ponieważ ta ścieżka zawiera przestrzeń, którą uważam, że muszę ją w jakiś sposób zacytować. Również muszę przekazać argument do skryptu, który jest również nazwą pliku zawierającą jeden lub więcej spacji. Bez względu na to, co próbuję, nie mogę go uruchomić. To jest mój najlepszy przypuszczenie tak daleko:

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

co daje błąd "Nieoczekiwany token. 'C: \ katalog 2 Dummy \ plik.txt' ekspresji lub oświadczenie w linii: 1 char: 136".

Edit: Ja pracowałem, dlaczego

powershell -command .\Foo.ps1 

nie działa. To dlatego, że mój plik Microsoft.PowerShell_profile.ps1 miał

cd c: \

tak szybko jak PowerShell zaczynał się on zmieniał katalog.

+1

Można również użyć -NoProfile podczas rozmowy z PowerShell cmd. – user467384

Odpowiedz

26

spróbuj tego:

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

@ShellShock Edytowałem swoją odpowiedź, aby usunąć '.' (dot sourcing), ponieważ jest bezużyteczne w tym przypadku. –

+1

To nie działa: Pls śledzić mój ostatni komentarz na: http://stackoverflow.com/questions/20804065/calling-powershell-function-from-command-line/20804221?noredirect=1#comment48796361_20804221 –

+0

@ ch.smrutiranjanparida Przepraszam, ale nie rozumiem, co nie działa. Unikaj komentarzy dotyczących problemów z kodowaniem i publikuj nowe pytanie ze szczegółowymi informacjami o Twoim błędzie. Powodzenia! –

26

dzwonisz skrypt nie komenda więc trzeba użyć -file np

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

PS V2

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

(sprawdź dno tej strony technicznej: http://technet.microsoft.com/en-us/library/ee176949.aspx)

+3

Pierwsze polecenie działa również w V2. –

+0

dziękuję za precyzję –

+0

Podręcznik użytkownika Windows PowerShell 1.0 został wycofany. Aby uzyskać najbardziej aktualną zawartość środowiska Windows PowerShell, przejdź do strony https://msdn.microsoft.com/en-au/powershell/scripting/core-powershell/console/powershell.exe-command-line-help#-file -filepath-parametry –

2

Zmień swój kod do następujących:

Function Foo($directory) 
    { 
     echo $directory 
    } 

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

A następnie wywołać ją jako:

powershell -ExecutionPolicy RemoteSigned -file "c: \ foo.ps1" „C: \ Documents and Settings”«c: \ test»

14

Korzystanie flagę -Command można wykonać całą linię powershell, jak gdyby był to polecenie w wierszu PowerShell:

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

Rozwiązało to mój problem z uruchamianiem poleceń PowerShell w zdarzeniach Visual Studio po kompilacji i wstępnej kompilacji.

2

Dodaj declation param na górze pliku 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) 

wynik

C:\temp> .\test.ps1 -Encoding ASCII 
Encoding : ASCII 
Powiązane problemy