PowerShell Samouczek
Rozpoczęcie pracy z programem PowerShell
Szukaj…
Uwagi
Windows PowerShell jest powłoką i komponentem skryptowym Windows Management Framework, frameworka automatyzacji / zarządzania konfiguracją firmy Microsoft zbudowanego na .NET Framework. PowerShell jest instalowany domyślnie we wszystkich obsługiwanych wersjach systemów operacyjnych klienta i serwera Windows od Windows 7 / Windows Server 2008 R2. Program PowerShell można zaktualizować w dowolnym momencie, pobierając późniejszą wersję systemu Windows Management Framework (WMF). Wersja „Alpha” programu PowerShell 6 jest wieloplatformowa (Windows, Linux i OS X) i należy ją pobrać i zainstalować z tej strony wydania .
Dodatkowe zasoby:
- Dokumentacja MSDN: https://msdn.microsoft.com/en-us/powershell/scripting/powershell-scripting
- TechNet: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
- Galeria PowerShell: https://www.powershellgallery.com/
- Blog MSDN: https://blogs.msdn.microsoft.com/powershell/
- Github: https://github.com/powershell
- Witryna społeczności: http://powershell.com/cs/
Wersje
Wersja | Zawarte w systemie Windows | Notatki | Data wydania |
---|---|---|---|
1.0 | XP / Server 2008 | 01.11.2006 | |
2.0 | 7 / Server 2008 R2 | 01.11.2009 | |
3.0 | 8 / Server 2012 | 01.08.2012 | |
4.0 | 8.1 / Server 2012 R2 | 01.11.2013 | |
5.0 | 10 / Server 2016 Przegląd technologii | 16.12.2015 | |
5.1 | 10 edycja rocznicowa / Server 2016 | 27.01.2017 |
Instalacja lub konfiguracja
Windows
PowerShell wchodzi w skład Windows Management Framework. Instalacja i konfiguracja nie są wymagane w nowoczesnych wersjach systemu Windows.
Aktualizacji programu PowerShell można dokonać, instalując nowszą wersję systemu Windows Management Framework.
Inne platformy
Wersję „Beta” programu PowerShell 6 można zainstalować na innych platformach. Pakiety instalacyjne są dostępne tutaj .
Na przykład PowerShell 6 dla Ubuntu 16.04 jest publikowany w repozytoriach pakietów w celu łatwej instalacji (i aktualizacji).
Aby zainstalować, uruchom następujące czynności:
# Import the public repository GPG keys curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - # Register the Microsoft Ubuntu repository curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list # Update apt-get sudo apt-get update # Install PowerShell sudo apt-get install -y powershell # Start PowerShell powershell
Po zarejestrowaniu repozytorium Microsoft raz jako superużytkownik, odtąd wystarczy użyć sudo apt-get upgrade powershell
aby go zaktualizować. Następnie uruchom powershell
Pozwól, aby skrypty przechowywane na twoim komputerze działały bez podpisu
Ze względów bezpieczeństwa program PowerShell jest domyślnie skonfigurowany tak, aby zezwalał tylko na wykonywanie podpisanych skryptów. Wykonanie następującego polecenia pozwoli ci na uruchamianie niepodpisanych skryptów (aby to zrobić, musisz uruchomić PowerShell jako Administrator).
Set-ExecutionPolicy RemoteSigned
Innym sposobem uruchamiania skryptów PowerShell jest użycie Bypass
jako ExecutionPolicy
:
powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
Lub z poziomu istniejącej konsoli PowerShell lub sesji ISE, uruchamiając:
Set-ExecutionPolicy Bypass Process
Tymczasowe obejście dla zasady wykonania można również uzyskać, uruchamiając plik wykonywalny programu PowerShell i przekazując dowolną prawidłową -ExecutionPolicy
jako parametr -ExecutionPolicy
. Zasada obowiązuje tylko w trakcie trwania procesu, więc nie jest potrzebny dostęp administracyjny do rejestru.
C:\>powershell -ExecutionPolicy RemoteSigned
Dostępnych jest wiele innych zasad, a witryny internetowe często zachęcają do korzystania z Set-ExecutionPolicy Unrestricted
. Ta zasada pozostaje na miejscu, dopóki nie zostanie zmieniona, i obniża poziom bezpieczeństwa systemu. To nie jest wskazane. RemoteSigned
jest użycie RemoteSigned
ponieważ umożliwia lokalnie zapisany i zapisany kod i wymaga podpisania kodu pozyskanego zdalnie za pomocą certyfikatu z zaufanego katalogu głównego.
Należy również pamiętać, że zasady wykonywania mogą być egzekwowane przez zasady grupy, dlatego nawet jeśli zasady zostaną zmienione na Unrestricted
dla całego systemu, zasady grupy mogą przywrócić to ustawienie w następnym okresie egzekwowania (zwykle 15 minut). Możesz zobaczyć zasady wykonywania ustawione w różnych zakresach za pomocą Get-ExecutionPolicy -List
Dokumentacja TechNet:
Set-ExecutionPolicy
about_Execution_Policies
Aliasy i podobne funkcje
W PowerShell istnieje wiele sposobów na osiągnięcie tego samego rezultatu. Można to dobrze zilustrować prostym i znanym przykładem Hello World
:
Za pomocą Write-Host
:
Write-Host "Hello World"
Za pomocą Write-Output
:
Write-Output 'Hello world'
Warto zauważyć, że chociaż Write-Output
i Write-Host
oba piszą na ekranie, istnieje subtelna różnica. Write-Host
zapisuje tylko na standardowym wyjściu (tj. Na ekranie konsoli), podczas gdy Write-Output
zapisuje zarówno na standardowym wyjściu ORAZ w strumieniu wyjściowym [sukces] pozwalającym na przekierowanie . Przekierowanie (i ogólnie strumienie) pozwala, aby dane wyjściowe jednego polecenia były kierowane jako dane wejściowe do drugiego, w tym przypisanie do zmiennej.
> $message = Write-Output "Hello World"
> $message
"Hello World"
Te podobne funkcje nie są aliasami, ale mogą dawać takie same wyniki, jeśli chce się uniknąć „zanieczyszczenia” strumienia sukcesu.
Write-Output
jest aliasowane do Echo
lub Write
Echo 'Hello world'
Write 'Hello world'
Lub po prostu wpisując „Hello world”!
'Hello world'
Wszystko to spowoduje oczekiwane wyjście konsoli
Hello world
Innym przykładem aliasów w programie PowerShell jest wspólne mapowanie zarówno starszych poleceń wiersza polecenia, jak i poleceń BASH na polecenia cmdlet programu PowerShell. Wszystkie z poniższych tworzą listę katalogów bieżącego katalogu.
C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
Wreszcie możesz utworzyć własny alias za pomocą polecenia cmdlet Set-Alias! Jako przykład przyjmijmy alisas Test-NetConnection
, który jest zasadniczo PowerShell równoważny z poleceniem ping wiersza poleceń, na „ping”.
Set-Alias -Name ping -Value Test-NetConnection
Teraz możesz używać ping
zamiast Test-NetConnection
! Pamiętaj, że jeśli alias jest już używany, nadpisujesz powiązanie.
Alias będzie żył, dopóki sesja nie będzie aktywna. Gdy zamkniesz sesję i spróbujesz uruchomić alias utworzony podczas ostatniej sesji, nie zadziała. Aby rozwiązać ten problem, możesz zaimportować wszystkie swoje aliasy z programu Excel do sesji raz przed rozpoczęciem pracy.
Rurociąg - użycie danych wyjściowych z polecenia cmdlet programu PowerShell
Jednym z pierwszych pytań, które ludzie mają, kiedy zaczynają używać programu PowerShell do pisania skryptów, jest sposób manipulowania danymi wyjściowymi z polecenia cmdlet w celu wykonania innej akcji.
Symbol rurociągu |
jest używany na końcu polecenia cmdlet, aby pobrać eksportowane dane i podać je do następnego polecenia cmdlet. Prostym przykładem jest użycie Select-Object do wyświetlenia tylko właściwości Name pliku pokazanego z Get-ChildItem:
Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
Bardziej zaawansowane wykorzystanie potoku pozwala nam przesyłać dane wyjściowe polecenia cmdlet do pętli foreach:
Get-ChildItem | ForEach-Object {
Copy-Item -Path $_.FullName -destination C:\NewDirectory\
}
#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
Zauważ, że w powyższym przykładzie użyto zmiennej automatycznej $ _. $ _ to krótki alias $ PSItem, który jest zmienną automatyczną, która zawiera bieżący element w potoku.
Komentowanie
Aby skomentować skrypty zasilania, wstawiając wiersz za pomocą symbolu #
(skrót)
# This is a comment in powershell
Get-ChildItem
Możesz także mieć komentarze wieloliniowe, używając odpowiednio <#
i #>
na początku i na końcu komentarza.
<#
This is a
multi-line
comment
#>
Get-ChildItem
Wywoływanie metod biblioteki .Net
Metody biblioteki statycznej .Net można wywoływać z programu PowerShell, umieszczając pełną nazwę klasy w trzecim nawiasie, a następnie wywołując metodę za pomocą ::
#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
Metody statyczne mogą być wywoływane z samej klasy, ale wywoływanie metod niestatycznych wymaga wystąpienia klasy .Net (obiektu).
Na przykład metody AddHours nie można wywołać z samej klasy System.DateTime. Wymaga instancji klasy:
C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
W takim przypadku najpierw tworzymy obiekt , na przykład:
C:\> $Object = [System.DateTime]::Now
Następnie możemy użyć metod tego obiektu, nawet metod, których nie można wywołać bezpośrednio z klasy System.DateTime, takich jak metoda AddHours:
C:\> $Object.AddHours(15)
Monday 12 September 2016 01:51:19
Tworzenie obiektów
Polecenie cmdlet New-Object
służy do tworzenia obiektu.
# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime
# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
W wielu przypadkach zostanie utworzony nowy obiekt w celu wyeksportowania danych lub przekazania ich do innego polecenia. Można to zrobić w następujący sposób:
$newObject = New-Object -TypeName PSObject -Property @{
ComputerName = "SERVER1"
Role = "Interface"
Environment = "Production"
}
Istnieje wiele sposobów tworzenia obiektu. Poniższa metoda jest prawdopodobnie najkrótszym i najszybszym sposobem utworzenia PSCustomObject
:
$newObject = [PSCustomObject]@{
ComputerName = 'SERVER1'
Role = 'Interface'
Environment = 'Production'
}
Jeśli masz już obiekt, ale potrzebujesz tylko jednej lub dwóch dodatkowych właściwości, możesz po prostu dodać tę właściwość za pomocą Select-Object
:
Get-ChildItem | Select-Object FullName, Name,
@{Name='DateTime'; Expression={Get-Date}},
@{Name='PropertieName'; Expression={'CustomValue'}}
Wszystkie obiekty mogą być przechowywane w zmiennych lub przekazywane do potoku. Możesz również dodać te obiekty do kolekcji, a następnie pokazać wyniki na końcu.
Kolekcje obiektów działają dobrze z Export-CSV (i Import-CSV). Każda linia CSV jest obiektem, każda kolumna jest właściwością.
Polecenia formatowania konwertują obiekty na strumień tekstowy do wyświetlania. Unikaj używania poleceń Format- * do ostatniego etapu przetwarzania danych, aby zachować użyteczność obiektów.