Udostępnij za pomocą


Uruchamianie poleceń w powłoce

PowerShell jest powłoką wiersza polecenia i językiem skryptowym używanym do automatyzacji. Podobnie jak w przypadku innych shelli, takich jak bash w systemie Linux czy Windows Command Shell (cmd.exe), PowerShell pozwala uruchamiać dowolne polecenia dostępne w systemie, a nie tylko polecenia PowerShell.

Typy poleceń

W przypadku dowolnej powłoki w dowolnym systemie operacyjnym istnieją trzy typy poleceń:

  • słowa kluczowe języka powłoki są częścią języka skryptowego powłoki.

    • Przykłady słów kluczowych bash to: if, then, else, elifi fi.
    • Przykłady słów kluczowych cmd.exe to: dir, copy, move, ifi echo.
    • Przykłady słów kluczowych programu PowerShell to: for, foreach, try, catchi trap.

    Słowa kluczowe języka powłoki mogą być używane tylko w środowisku uruchomieniowym powłoki. Brak pliku wykonywalnego poza powłoką, który zapewnia funkcjonalność słowa kluczowego.

  • natywne polecenia systemu operacyjnego to pliki wykonywalne zainstalowane w systemie operacyjnym. Pliki wykonywalne można uruchamiać z dowolnej powłoki wiersza polecenia, takiej jak PowerShell. Obejmuje to pliki skryptów, które wymagają prawidłowego działania innych powłok. Na przykład, jeśli uruchomisz skrypt wsadowy systemu Windows (plik.cmd) w programie PowerShell, program PowerShell uruchomi cmd.exe i przekaże plik wsadowy do wykonania.

  • Polecenia specyficzne dla środowiska powłoki to polecenia zdefiniowane w plikach zewnętrznych, które mogą być używane tylko w kontekście działania powłoki. Obejmuje to skrypty, funkcje i moduły, które dodają polecenia do środowiska uruchomieniowego powłoki. W programie PowerShell te polecenia dodane przez moduł są nazywane poleceniami cmdlet (wymawiane jako "command-let").

Uruchamianie poleceń natywnych

Dowolne natywne polecenie można uruchomić z poziomu wiersza polecenia programu PowerShell. Zazwyczaj polecenie jest uruchamiane dokładnie tak, jak w bash lub cmd.exe. W poniższym przykładzie pokazano uruchomienie polecenia grep w bash w systemie Ubuntu Linux.

sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

Po uruchomieniu programu PowerShell w systemie Ubuntu możesz uruchomić to samo polecenie w wierszu polecenia programu PowerShell:

PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash

Przekazywanie argumentów do poleceń natywnych

Większość powłok zawiera funkcje używania zmiennych, oceniania wyrażeń i obsługi łańcuchów znaków. Ale każda powłoka robi te rzeczy inaczej. W programie PowerShell wszystkie parametry zaczynają się od znaku łącznika (-). W systemie cmd.exe większość parametrów polecenia używa ukośnika (/). Inne narzędzia wiersza polecenia mogą używać spacji, łączników, podwójnej kreski (--).

Każda powłoka ma własny sposób obsługi i oceniania ciągów w wierszu polecenia. Podczas uruchamiania natywnych poleceń w programie PowerShell, które oczekują cytowania ciągów w określony sposób, może być konieczne dostosowanie sposobu przekazywania tych ciągów.

Aby uzyskać więcej informacji, zobacz następujące artykuły:

Program PowerShell 7.2 wprowadził nową funkcję eksperymentalną PSNativeCommandArgumentPassing, która poprawiła natywną obsługę poleceń. Aby uzyskać więcej informacji, zobacz $PSNativeCommandArgumentPassing.

Obsługa danych wyjściowych i błędów

Program PowerShell ma również więcej strumieni wyjściowych niż inne powłoki. Powłoki bash i cmd.exe mają stdout i stderr. Program PowerShell ma sześć strumieni wyjściowych. Aby uzyskać więcej informacji, zobacz about_Redirection i about_Output_Streams.

Ogólnie rzecz biorąc, dane wyjściowe wysyłane do stdout za pomocą natywnego polecenia są wysyłane do strumienia powodzenia w programie PowerShell. Dane wyjściowe wysyłane do stderr za pomocą natywnego polecenia są wysyłane do strumienia błąd w programie PowerShell.

Gdy natywne polecenie ma kod zakończenia innego niż zero, $? jest ustawiona na $false. Jeśli kod zakończenia ma wartość zero, $? jest ustawiona na wartość $true.

Jednak program PowerShell 7.2 zmienił to zachowanie. Rekordy błędów przekierowane z natywnych poleceń, takich jak w przypadku używania operatorów przekierowania (2>&1), nie są zapisywane w zmiennej $Error programu PowerShell, a zmienna preferencji $ErrorActionPreference nie ma wpływu na przekierowane dane wyjściowe.

Wiele natywnych poleceń zapisuje w stderr jako alternatywny strumień dodatkowych informacji. To zachowanie może spowodować zamieszanie w programie PowerShell podczas przeglądania błędów, a dodatkowe informacje wyjściowe mogą zostać utracone, jeśli $ErrorActionPreference jest ustawiony na stan wyciszenia danych wyjściowych.

Program PowerShell 7.3 dodał eksperymentalną funkcję PSNativeCommandErrorActionPreference, która umożliwia kontrolowanie sposobu obsługi kodów zakończenia innych niż zero z natywnych poleceń. Aby uzyskać więcej informacji, zobacz $PSNativeCommandUseErrorActionPreference.

Uruchamianie poleceń programu PowerShell

Jak wspomniano wcześniej, polecenia programu PowerShell są nazywane poleceniami cmdlet. Polecenia cmdlet są gromadzone w modułach programu PowerShell i mogą być ładowane na żądanie. Polecenia cmdlet można pisać w dowolnym skompilowanym języku .NET lub użyć samego języka skryptów programu PowerShell.

Polecenia programu PowerShell uruchamiające inne polecenia

Program PowerShell operator wywołania (&) umożliwia uruchamianie poleceń przechowywanych w zmiennych i reprezentowanych przez ciągi lub bloki skryptu. Możesz użyć operatora , aby uruchomić dowolne natywne polecenie lub polecenie programu PowerShell. Jest to przydatne w skryscie, gdy trzeba dynamicznie konstruować parametry wiersza polecenia dla natywnego polecenia. Aby uzyskać więcej informacji, zobacz operatora wywołania.

Polecenie cmdlet Start-Process może służyć do uruchamiania natywnych poleceń, ale należy ich używać tylko wtedy, gdy trzeba kontrolować sposób wykonywania polecenia. Polecenie cmdlet ma parametry do obsługi następujących scenariuszy:

  • Uruchamianie polecenia przy użyciu różnych poświadczeń
  • Ukryj okno konsoli utworzone przez nowy proces
  • Przekieruj strumień stdin, stdouti stderr
  • Użyj innego katalogu roboczego dla polecenia

Poniższy przykład uruchamia natywne polecenie sort.exe z przekierowanymi strumieniami wejściowymi i wyjściowymi.

$processOptions = @{
    FilePath = "sort.exe"
    RedirectStandardInput = "TestSort.txt"
    RedirectStandardOutput = "Sorted.txt"
    RedirectStandardError = "SortError.txt"
    UseNewEnvironment = $true
}
Start-Process @processOptions

Aby uzyskać więcej informacji, zobacz Start-Process.

W systemie Windows polecenie cmdlet Invoke-Item wykonuje domyślną akcję dla określonego elementu. Na przykład uruchamia plik wykonywalny lub otwiera plik dokumentu przy użyciu aplikacji skojarzonej z typem pliku dokumentu. Domyślna akcja zależy od typu elementu i dostawcy programu PowerShell, który zapewnia dostęp do elementu.

Poniższy przykład otwiera repozytorium kodu źródłowego programu PowerShell w domyślnej przeglądarce internetowej.

Invoke-Item https://github.com/PowerShell/PowerShell

Aby uzyskać więcej informacji, zobacz Invoke-Item.