Udostępnij za pośrednictwem


Uruchamianie poleceń w powłoce

PowerShell jest powłoką wiersza polecenia i językiem skryptowym używanym do automatyzacji. Podobnie jak w przypadku innych powłok, takich jak bash w systemie Linux czy powłoki poleceń systemu Windows (cmd.exe), PowerShell umożliwia uruchamianie dowolnego polecenia dostępnego w systemie, a nie tylko poleceń 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. Nie istnieje plik wykonywalny zewnętrzny względem powłoki, który dostarczałby 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 mogą wymagać innych powłok do prawidłowego działania. 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. Obejmują one skrypty i funkcje lub mogą być specjalnie skompilowanymi modułami, które dodają polecenia do środowiska uruchomieniowego powłoki. W programie PowerShell te polecenia 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 cmd.exewiększość parametrów używa znaku ukośnika (/). Inne narzędzia wiersza polecenia mogą nie mieć specjalnego znaku dla parametrów.

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 inny niż zero, $? jest ustawiona na $false. Jeśli kod zakończenia ma wartość zero, $? jest ustawiona na wartość $true.

Jednak ta zmiana została zmieniona w programie PowerShell 7.2. 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ł nową funkcję eksperymentalną PSNativeCommandErrorActionPreference, która umożliwia kontrolowanie, czy dane wyjściowe stderr są traktowane jako błąd. 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żna go użyć do uruchomienia dowolnego natywnego polecenia lub polecenia 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 jest rozpoznawana przez dostawcę 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.