2009-08-18 22 views
72

Od lat używam powłoki cmd/DOS/Windows i przekazywałem argumenty wiersza polecenia do plików wsadowych. Na przykład mam plik, zuzu.bat i mam do niego dostęp %1, %2 itd. Teraz chcę zrobić to samo, gdy wywołuję skrypt PowerShellwhen I am in a Cmd.exe shell. Mam skrypt, xuxu.ps1 (i dodałem PS1 do mojej zmiennej PATHEXT i powiązanych plików PS1 z PowerShell). Ale bez względu na to, co robię, wydaje mi się, że nie mogę uzyskać niczego ze zmiennej $args. Ma zawsze długość 0.Jak przekazywać argumenty wiersza polecenia do pliku PS1 PowerShell

Jeśli jestem w powłoce PowerShell, zamiast cmd.exe, działa (oczywiście). Ale nie jestem jeszcze wystarczająco wygodny, aby żyć w środowisku PowerShell w pełnym wymiarze godzin. Nie chcę pisać: powershell.exe -command xuxu.ps1 p1 p2 p3 p4. Chcę wpisać xuxu p1 p2 p3 p4.

Czy to możliwe, a jeśli tak, to w jaki sposób?

Próbka nie mogę dostać się do pracy jest trywialne, foo.ps1:

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

Wyniki są zawsze tak:

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

Odpowiedz

16

OK, więc najpierw to łamie podstawową funkcję zabezpieczeń w PowerShell. Z tego zrozumienia, oto jak można to zrobić:

  1. otworzyć okno Windows Explorer
  2. Menu Narzędzia ->Opcje folderów -> zakładka Typy plików
  3. Znajdź typ pliku PS1 i kliknij przycisk zaawansowany
  4. Kliknij przycisk Nowy
  5. Dla działania: Otwórz
  6. do wypuszczenia aplikacji: "C: \ WINNT \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-file" "% 1" % *

Możesz umieścić -NoProfile również tam argument, w zależności od profilu.

+3

Myślę, że klucz jest w kroku 6, gdzie przechodzą w parametrach do PowerShell .exe. Daniel mówi, że skojarzył pliki PS1 z PowerShellem, ale to nie przekazuje argumentów bez dodatkowych specyfikacji% 1% *. Zwróć również uwagę, że parametr -File nie jest dostępny w wersji V1. To nowość w V2. –

+0

Dobre złapanie w odniesieniu do parametru -file, o którym zapomniałem. – EBGreen

+0

Muszę zainstalować V2, zanim będę mógł spróbować Twojej sugestii. Dzięki.Kiedy mówisz, że łamiesz podstawową funkcję zabezpieczeń, co to znaczy "to"? Wywołanie skryptu PowerShell z programu Cmd.exe tak, jakby był plikiem .com/.bat/.exe? Przekazywanie parametrów do skryptu? –

4

Być może można zawinąć wywołanie PowerShell w pliku .bat tak:

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

Jeśli następnie umieszcza ten plik pod folderu w PATH, można nazwać skrypty PowerShell tak:

ps foo 1 2 3 

Cytowanie może trochę brudny, ale:

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

+1 za wyświetlenie potrójnych cytatów. przez co utknąłem na chwilę. – DeanOC

1

Możesz nie otrzymać "xuxu p1 p2 p3 p4", jak się wydaje.Ale kiedy jesteś w PowerShell i ustawić

PS > set-executionpolicy Unrestricted -scope currentuser 

Można uruchomić te skrypty tak:

./xuxu p1 p2 p3 p4 

lub

.\xuxu p1 p2 p3 p4 

lub

./xuxu.ps1 p1 p2 p3 p4 

Mam nadzieję, że sprawia, że ​​czujesz się lepiej z Powe rShell.

26

This article pomaga. W szczególności, w tej sekcji:

-file

Uruchamia określony skrypt w zakresie lokalnego („kropka pozyskiwaniem”), tak, że funkcje i zmienne, że skrypt tworzy są dostępne w bieżącej sesji . Wprowadź ścieżkę do pliku skryptu i wszelkie parametry. Plik musi być ostatnim parametrem w poleceniu, ponieważ wszystkie znaki wpisane po nazwie parametru pliku są interpretowane jako ścieżka do pliku skryptu, a następnie parametry skryptu.

tj

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

środki uruchamiania myfile.ps1 pliku i arg1 arg2 & arg3 są parametry skryptu PowerShell.

8

Zadeklaruj swoje parametry w pliku, takie jak param ([string] $ para1 ....... [string] $ param2).

Teraz nazywamy plik PowerShell jak temp.ps1 para1 para2....para10 itp

11

Po wykopaniu przez dokumentacji PowerShell, odkryłem kilka przydatnych informacji na temat tego problemu. Nie możesz użyć $args, jeśli użyłeś param(...) na początku pliku; zamiast tego będziesz musiał użyć $PSBoundParameters. Kopiuję/wklejałem twój kod do skryptu PowerShell i działał tak, jak można by oczekiwać w PowerShell w wersji 2 (nie jestem pewien, w jakiej wersji byłeś włączony, kiedy wpadłeś na ten problem).

Jeśli używasz $PSBoundParameters (i działa TYLKO jeśli używasz param(...) na początku skryptu), to nie jest to tablica, jest to tablica haszująca, więc będziesz musiał odwołać się do niej używając klucza/para wartości.

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 

I kiedy nazywa się ...

PS> ./foo.ps1 a b c d 

Rezultatem jest ...

Num Args: 4 
$p1=a $p2=b $p3=c $p4=d 
Powiązane problemy