Sök…


Anmärkningar

Windows PowerShell är en skal- och skriptkomponent i Windows Management Framework, ett ramverk för automatisering / konfigurering från Microsoft som bygger på .NET Framework. PowerShell installeras som standard på alla versioner av Windows-klient- och serveroperativsystem som stöds sedan Windows 7 / Windows Server 2008 R2. Powershell kan uppdateras när som helst genom att ladda ner en senare version av Windows Management Framework (WMF). "Alpha" -versionen av PowerShell 6 är korsplattform (Windows, Linux och OS X) och måste laddas ner och installeras från den här utgåvan .

Ytterligare resurser:

versioner

Version Ingår i Windows anteckningar Utgivningsdatum
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 Jubileumsutgåva / Server 2016 2017/01/27

Installation eller installation

Windows

PowerShell ingår i Windows Management Framework. Installation och installation krävs inte i moderna versioner av Windows.

Uppdateringar av PowerShell kan genomföras genom att installera en nyare version av Windows Management Framework.

Andra plattformar

"Beta" -versionen av PowerShell 6 kan installeras på andra plattformar. Installationspaketen finns här .

Till exempel publiceras PowerShell 6 för Ubuntu 16.04 till paketförvar för enkel installation (och uppdateringar).

För att installera kör följande:

# 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

När du registrerat Microsoft-förvaret en gång som superanvändare, från och med sedan, behöver du bara använda sudo apt-get upgrade powershell att uppdatera det. Sedan kör bara powershell

Låt skript lagrade på din maskin köra osignerat

Av säkerhetsskäl är PowerShell inställt som standard så att endast signerade skript kan köras. Genom att utföra följande kommando kan du köra osignerade skript (du måste köra PowerShell som administratör för att göra detta).

Set-ExecutionPolicy RemoteSigned

Ett annat sätt att köra PowerShell-skript är att använda Bypass som ExecutionPolicy :

powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"

Eller från din befintliga PowerShell-konsol eller ISE-session genom att köra:

 Set-ExecutionPolicy Bypass Process

En tillfällig lösning för exekveringspolicy kan också uppnås genom att köra Powershell-körbara och skicka alla giltiga -ExecutionPolicy som -ExecutionPolicy parameter. Policyen gäller bara under processens livstid, så ingen administrativ åtkomst till registret behövs.

C:\>powershell -ExecutionPolicy RemoteSigned

Det finns flera andra policyer tillgängliga, och webbplatser online uppmuntrar ofta dig att använda Set-ExecutionPolicy Unrestricted . Denna policy förblir på plats tills den ändras och sänker systemets säkerhetsställning. Detta rekommenderas inte. Användning av RemoteSigned rekommenderas eftersom det tillåter lokalt lagrad och skriven kod, och kräver fjärrförvärvad kod signeras med ett certifikat från en pålitlig rot.

Se också till att genomförandepolicyn kan verkställas av grupppolicy, så att även om policyn ändras till Unrestricted systemomfattande, kan grupppolicy återställa inställningen vid nästa tillämpningsintervall (vanligtvis 15 minuter). Du kan se exekveringspolicyn inställd på olika områden med Get-ExecutionPolicy -List

TechNet-dokumentation:
Set-ExecutionPolicy
about_Execution_Policies

Aliaser och liknande funktioner

I PowerShell finns det många sätt att uppnå samma resultat. Detta kan illustreras fint med det enkla och bekanta Hello World exemplet:

Använda Write-Host :

Write-Host "Hello World"  

Använda Write-Output :

Write-Output 'Hello world'

Det är värt att notera att även om Write-Output & Write-Host båda skriver på skärmen finns det en subtil skillnad. Write-Host skriver endast till stdout (dvs. konsolskärmen), medan Write-Output skriver till både stdout OCH till output [success] -strömmen som möjliggör omdirigering . Omdirigering (och strömmar i allmänhet) möjliggör att utgången från ett kommando riktas som inmatning till ett annat inklusive tilldelning till en variabel.

> $message = Write-Output "Hello World"
> $message
"Hello World"

Dessa liknande funktioner är inte alias, men kan ge samma resultat om man vill undvika att "förorena" framgångsströmmen.

Write-Output är alias till Echo eller Write

Echo 'Hello world'
Write 'Hello world'

Eller genom att bara skriva "Hej världen"!

'Hello world'

Allt detta kommer att resultera med den förväntade konsolutgången

Hello world

Ett annat exempel på alias i PowerShell är den vanliga kartläggningen av både äldre kommandotolkskommandon och BASH-kommandon till PowerShell cmdlets. Alla följande skapar en kataloglista över den aktuella katalogen.

C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem

Slutligen kan du skapa ditt eget alias med cmdlet Set-Alias! Låt oss som exempel Test-NetConnection , som i huvudsak är PowerShell motsvarande kommandotolkens ping-kommando, till "ping".

Set-Alias -Name ping -Value Test-NetConnection

Nu kan du använda ping istället för Test-NetConnection ! Var medveten om att om aliaset redan används kommer du att skriva över föreningen.

Aliaset kommer att leva tills sessionen är aktiv. När du stänger sessionen och försöker köra aliaset som du har skapat under din senaste session kommer det inte att fungera. För att lösa problemet kan du importera alla dina alias från en excel till din session en gång innan du börjar arbetet.

Rörledningen - Använd utdata från en PowerShell-cmdlet

En av de första frågorna som människor har när de börjar använda PowerShell för skript är hur man manipulerar utdata från en cmdlet för att utföra en annan åtgärd.

Rörledningssymbolen | används i slutet av en cmdlet för att ta data som den exporterar och mata dem till nästa cmdlet. Ett enkelt exempel är att använda Select-Object för att bara visa Namnegenskapen för en fil som visas från Get-ChildItem:

Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name

Mer avancerad användning av rörledningen gör det möjligt för oss att leda utgången från en cmdlet till en förhandslinga:

Get-ChildItem | ForEach-Object {
    Copy-Item -Path $_.FullName -destination C:\NewDirectory\ 
}

#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }

Observera att exemplet ovan använder den automatiska variabeln $ _. $ _ är det korta aliaset till $ PSItem, som är en automatisk variabel som innehåller det aktuella objektet i pipeline.

kommentar

För att kommentera kraftskript genom att förbereda linjen med symbolen # (hash)

# This is a comment in powershell
Get-ChildItem

Du kan också ha kommentarer med flera linjer med hjälp av <# och #> i början och slutet av kommentaren.

<#
This is a 
multi-line
comment
#>
Get-ChildItem

Ringer .Net-biblioteksmetoder

Statiska .Net-biblioteksmetoder kan anropas från PowerShell genom att kapsla in hela klassens namn i tredje fästen och sedan ringa metoden med hjälp av ::

#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe

Statiska metoder kan kallas från själva klassen, men att ringa icke-statiska metoder kräver en instans av klassen .Net (ett objekt).

Till exempel kan inte AddHours-metoden anropas från klassen System.DateTime själv. Det kräver en instans av klassen:

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

I det här fallet skapar vi först ett objekt , till exempel:

C:\> $Object = [System.DateTime]::Now

Sedan kan vi använda metoder för det objektet, även metoder som inte kan kallas direkt från klassen System.DateTime, som AddHours-metoden:

C:\> $Object.AddHours(15)

Monday 12 September 2016 01:51:19

Skapa objekt

New-Object cmdlet används för att skapa ett objekt.

# 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"

I många fall skapas ett nytt objekt för att exportera data eller skicka det till en annan kommandot. Detta kan göras så:

$newObject = New-Object -TypeName PSObject -Property @{
    ComputerName = "SERVER1"
    Role = "Interface"
    Environment = "Production"
}

Det finns många sätt att skapa ett objekt. Följande metod är förmodligen det kortaste och snabbaste sättet att skapa ett PSCustomObject :

$newObject = [PSCustomObject]@{
    ComputerName = 'SERVER1'
    Role         = 'Interface'
    Environment  = 'Production'
}

Om du redan har ett objekt, men bara behöver en eller två extra egenskaper, kan du helt enkelt lägga till den egenskapen med hjälp av Select-Object :

Get-ChildItem | Select-Object FullName, Name, 
    @{Name='DateTime'; Expression={Get-Date}}, 
    @{Name='PropertieName'; Expression={'CustomValue'}}

Alla objekt kan lagras i variabler eller skickas in i pipeline. Du kan också lägga till dessa objekt i en samling och sedan visa resultaten i slutet.

Samlingar av objekt fungerar bra med Export-CSV (och Import-CSV). Varje rad i CSV är ett objekt, varje kolumn är en egenskap.

Formatkommandon konverterar objekt till textström för visning. Undvik att använda Format- * -kommandon tills det sista steget i databehandling för att behålla objekternas användbarhet.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow