PowerShellAan de slag met PowerShell


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:

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

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.

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

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
 

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
 

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.

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

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.