PowerShell Zelfstudie
Aan de slag met PowerShell
Zoeken…
Opmerkingen
Windows PowerShell is een shell- en scriptcomponent van het Windows Management Framework, een automatiserings- / configuratiebeheerraamwerk van Microsoft gebouwd op het .NET Framework. PowerShell wordt standaard geïnstalleerd op alle ondersteunde versies van Windows-client- en serverbesturingssystemen sinds Windows 7 / Windows Server 2008 R2. Powershell kan op elk moment worden bijgewerkt door een latere versie van het Windows Management Framework (WMF) te downloaden. De "Alpha" -versie van PowerShell 6 is platformonafhankelijk (Windows, Linux en OS X) en moet worden gedownload en geïnstalleerd vanaf deze releasepagina .
Aanvullende bronnen:
- MSDN-documentatie: https://msdn.microsoft.com/en-us/powershell/scripting/powershell-scripting
- TechNet: https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx
- PowerShell Gallery: https://www.powershellgallery.com/
- MSDN-blog: https://blogs.msdn.microsoft.com/powershell/
- Github: https://github.com/powershell
- Community-site: http://powershell.com/cs/
versies
Versie | Inbegrepen bij Windows | Notes | Publicatiedatum |
---|---|---|---|
1.0 | XP / Server 2008 | 2006-11-01 | |
2.0 | 7 / Server 2008 R2 | 2009-11-01 | |
3.0 | 8 / Server 2012 | 2012-08-01 | |
4.0 | 8.1 / Server 2012 R2 | 2013/11/01 | |
5.0 | 10 / Server 2016 Tech Preview | 2015/12/16 | |
5.1 | 10-jarig jubileumeditie / Server 2016 | 2017/01/27 |
Installatie of instellingen
ramen
PowerShell is opgenomen in het Windows Management Framework. Installatie en instellingen zijn niet vereist op moderne versies van Windows.
Updates voor PowerShell kunnen worden bereikt door een nieuwere versie van Windows Management Framework te installeren.
Andere platforms
"Beta" -versie van PowerShell 6 kan op andere platforms worden geïnstalleerd. De installatiepakketten zijn hier beschikbaar.
PowerShell 6, voor Ubuntu 16.04, wordt bijvoorbeeld gepubliceerd in pakketrepository's voor eenvoudige installatie (en updates).
Voer de volgende stappen uit om te installeren:
# 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
Nadat u de Microsoft-repository eenmaal als superuser hebt geregistreerd, hoeft u vanaf dat moment alleen sudo apt-get upgrade powershell
te gebruiken om deze bij te werken. Voer dan powershell
Toestaan dat scripts die op uw computer zijn opgeslagen, niet-ondertekend uitvoeren
Om veiligheidsredenen is PowerShell standaard ingesteld om alleen ondertekende scripts uit te voeren. Door de volgende opdracht uit te voeren, kunt u niet-ondertekende scripts uitvoeren (hiervoor moet u PowerShell uitvoeren als beheerder).
Set-ExecutionPolicy RemoteSigned
Een andere manier om PowerShell-scripts uit te voeren, is Bypass
te gebruiken als ExecutionPolicy
:
powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
Of vanuit uw bestaande PowerShell-console of ISE-sessie door:
Set-ExecutionPolicy Bypass Process
Een tijdelijke oplossing voor het uitvoeringsbeleid kan ook worden bereikt door het uitvoerbare bestand Powershell uit te voeren en een geldig beleid door te geven als parameter -ExecutionPolicy
. Het beleid is alleen van kracht tijdens de levensduur van het proces, dus er is geen beheerderstoegang tot het register nodig.
C:\>powershell -ExecutionPolicy RemoteSigned
Er zijn meerdere andere beleidsregels beschikbaar, en sites online raden u vaak aan Set-ExecutionPolicy Unrestricted
. Dit beleid blijft van kracht totdat het wordt gewijzigd en verlaagt de systeembeveiliging. Dit is niet aan te raden. Gebruik van RemoteSigned
wordt aanbevolen omdat het lokaal opgeslagen en geschreven code mogelijk maakt en vereist dat op afstand verkregen code wordt ondertekend met een certificaat van een vertrouwde root.
Houd er ook rekening mee dat het uitvoeringsbeleid kan worden afgedwongen door groepsbeleid, zodat zelfs als het beleid wordt gewijzigd in Unrestricted
systeembreed, groepsbeleid deze instelling kan terugdraaien op het volgende handhavingsinterval (meestal 15 minuten). U kunt het uitvoeringsbeleid zien dat is ingesteld bij de verschillende bereiken met Get-ExecutionPolicy -List
TechNet-documentatie:
Set-ExecutionPolicy
about_Execution_Policies
Aliassen en soortgelijke functies
In PowerShell zijn er veel manieren om hetzelfde resultaat te bereiken. Dit kan mooi worden geïllustreerd met het eenvoudige en vertrouwde Hello World
voorbeeld:
Write-Host
:
Write-Host "Hello World"
Gebruik van Write-Output
:
Write-Output 'Hello world'
Het is vermeldenswaard dat, hoewel Write-Output
& Write-Host
beide naar het scherm schrijven, er een subtiel verschil is. Write-Host
schrijft alleen naar stdout (dwz de console scherm), terwijl Write-Output
schrijft zowel stdout AND om de output [succes] stroom waardoor omleiding . Met omleiding (en streams in het algemeen) kan de uitvoer van een opdracht als invoer naar een andere worden geleid, inclusief toewijzing aan een variabele.
> $message = Write-Output "Hello World"
> $message
"Hello World"
Deze vergelijkbare functies zijn geen aliassen, maar kunnen dezelfde resultaten opleveren als men wil voorkomen dat de successtroom wordt "vervuild".
Write-Output
krijgt een alias als Echo
of Write
Echo 'Hello world'
Write 'Hello world'
Of door simpelweg 'Hallo wereld' te typen!
'Hello world'
Dit alles zal resulteren in de verwachte console-uitvoer
Hello world
Een ander voorbeeld van aliassen in PowerShell is de gemeenschappelijke toewijzing van zowel oudere opdrachtpromptopdrachten als BASH-opdrachten aan PowerShell-cmdlets. Al het volgende produceert een directorylijst van de huidige directory.
C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
Ten slotte kunt u uw eigen alias maken met de cmdlet Set-Alias! Laten we als voorbeeld Test-NetConnection
, wat in wezen het PowerShell-equivalent is van de ping-opdracht van de opdrachtprompt, "ping" noemen.
Set-Alias -Name ping -Value Test-NetConnection
Nu kunt u ping
plaats van Test-NetConnection
! Houd er rekening mee dat als u de alias al gebruikt, u de koppeling overschrijft.
De alias zal leven totdat de sessie actief is. Nadat u de sessie hebt gesloten en probeert de alias uit te voeren die u in uw laatste sessie hebt gemaakt, werkt deze niet meer. Om dit probleem op te lossen, kunt u al uw aliassen van een excel eenmaal in uw sessie importeren voordat u met uw werk begint.
De pijpleiding - Uitvoer van een PowerShell-cmdlet gebruiken
Een van de eerste vragen die mensen hebben wanneer ze PowerShell voor scripting gaan gebruiken, is hoe ze de uitvoer van een cmdlet kunnen manipuleren om een andere actie uit te voeren.
Het pijpleidingssymbool |
wordt aan het einde van een cmdlet gebruikt om de gegevens te exporteren en naar de volgende cmdlet te voeren. Een eenvoudig voorbeeld is het gebruik van Select-Object om alleen de eigenschap Name weer te geven van een bestand dat wordt getoond vanuit Get-ChildItem:
Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
Meer geavanceerd gebruik van de pijplijn stelt ons in staat om de uitvoer van een cmdlet in een foreach-lus te leiden:
Get-ChildItem | ForEach-Object {
Copy-Item -Path $_.FullName -destination C:\NewDirectory\
}
#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
Merk op dat het bovenstaande voorbeeld de automatische variabele $ _ gebruikt. $ _ is de korte alias van $ PSItem, een automatische variabele die het huidige item in de pijplijn bevat.
In een reactie
Om commentaar te geven op power scripts door de regel voor te bereiden met behulp van het #
(hekje) symbool
# This is a comment in powershell
Get-ChildItem
U kunt ook reacties met meerdere regels gebruiken met respectievelijk <#
en #>
aan het begin en einde van de reactie.
<#
This is a
multi-line
comment
#>
Get-ChildItem
Bellen. Net Library-methoden
Statische .Net-bibliotheekmethoden kunnen worden opgeroepen vanuit PowerShell door de volledige klassenaam in een derde haakje te plaatsen en vervolgens de methode aan te roepen met ::
#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
Statische methoden kunnen vanuit de klasse zelf worden aangeroepen, maar voor het aanroepen van niet-statische methoden is een instantie van de .Net-klasse (een object) vereist.
De methode AddHours kan bijvoorbeeld niet worden aangeroepen vanuit de klasse System.DateTime zelf. Het vereist een instantie van de klasse:
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
In dit geval maken we eerst een object , bijvoorbeeld:
C:\> $Object = [System.DateTime]::Now
Vervolgens kunnen we methoden van dat object gebruiken, zelfs methoden die niet rechtstreeks vanuit de klasse System.DateTime kunnen worden aangeroepen, zoals de methode AddHours:
C:\> $Object.AddHours(15)
Monday 12 September 2016 01:51:19
Objecten maken
De cmdlet New-Object
wordt gebruikt om een object te maken.
# 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"
In veel gevallen wordt een nieuw object gemaakt om gegevens te exporteren of door te geven aan een andere opdracht. Dit kan als volgt:
$newObject = New-Object -TypeName PSObject -Property @{
ComputerName = "SERVER1"
Role = "Interface"
Environment = "Production"
}
Er zijn veel manieren om een object te maken. De volgende methode is waarschijnlijk de kortste en snelste manier om een PSCustomObject
te maken:
$newObject = [PSCustomObject]@{
ComputerName = 'SERVER1'
Role = 'Interface'
Environment = 'Production'
}
Als u al een object hebt, maar u hebt slechts één of twee extra eigenschappen nodig, kunt u die eigenschap eenvoudig toevoegen met behulp van Select-Object
:
Get-ChildItem | Select-Object FullName, Name,
@{Name='DateTime'; Expression={Get-Date}},
@{Name='PropertieName'; Expression={'CustomValue'}}
Alle objecten kunnen worden opgeslagen in variabelen of worden doorgegeven aan de pijplijn. U kunt deze objecten ook aan een verzameling toevoegen en de resultaten aan het einde tonen.
Collecties van objecten werken goed met Export-CSV (en Import-CSV). Elke regel van de CSV is een object, elke kolom een eigenschap.
Opmaakopdrachten zetten objecten om in tekststream voor weergave. Gebruik geen Format- * -opdrachten tot de laatste stap van elke gegevensverwerking om de bruikbaarheid van de objecten te behouden.