Dela via


about_Scripts

Kort beskrivning

Beskriver hur du kör och skriver skript i PowerShell.

Lång beskrivning

Ett skript är en oformaterad textfil som innehåller ett eller flera PowerShell-kommandon. PowerShell-skript har ett .ps1 filnamnstillägg.

Att köra ett skript är ungefär som att köra en cmdlet. Du skriver sökvägen och filnamnet för skriptet och använder parametrar för att skicka data och ange alternativ. Du kan köra skript på datorn eller i en fjärrsession på en annan dator.

När du skriver ett skript sparas ett kommando för senare användning och det blir enkelt att dela med andra. Det viktigaste är att du kan köra kommandona genom att skriva skriptsökvägen och filnamnet. Skript kan vara lika enkla som ett enda kommando i en fil eller så omfattande som ett komplext program.

Skript har ytterligare funktioner, till exempel specialkommentare #Requires , användning av parametrar, stöd för dataavsnitt och digital signering för säkerhet. Du kan också skriva hjälpavsnitt för skript och för alla funktioner i skriptet.

Så här kör du ett skript

Innan du kan köra ett skript i Windows måste du ändra standardprincipen för PowerShell-körning. Körningsprincipen gäller inte för PowerShell som körs på plattformar som inte är Windows-plattformar.

Standardkörningsprincipen, Restricted, förhindrar att alla skript körs, inklusive skript som du skriver på den lokala datorn. Mer information finns i about_Execution_Policies.

Körningsprincipen sparas i registret, så du behöver bara ändra den en gång på varje dator.

Om du vill ändra körningsprincipen använder du följande procedur.

Skriv i kommandotolken:

Set-ExecutionPolicy AllSigned

eller

Set-ExecutionPolicy RemoteSigned

Ändringen träder i kraft omedelbart.

Om du vill köra ett skript skriver du det fullständiga namnet och den fullständiga sökvägen till skriptfilen.

För att till exempel köra skriptet Get-ServiceLog.ps1 i mappen C:\Scripts skriver du:

C:\Scripts\Get-ServiceLog.ps1

Om du vill köra ett skript i den aktuella katalogen skriver du sökvägen till den aktuella katalogen eller använder en punkt för att representera den aktuella katalogen, följt av en omvänt snedstreckssökväg (.\).

Om du till exempel vill köra skriptet ServicesLog.ps1 i den lokala katalogen skriver du:

.\Get-ServiceLog.ps1

Om skriptet har parametrar skriver du parametrarna och parametervärdena efter skriptfilens namn.

Följande kommando använder till exempel parametern ServiceName i Get-ServiceLog-skriptet för att begära en logg över WinRM-tjänstaktivitet.

.\Get-ServiceLog.ps1 -ServiceName WinRM

Som en säkerhetsfunktion kör PowerShell inte skript när du dubbelklickar på skriptikonen i Istraživač datoteka eller när du skriver skriptnamnet utan en fullständig sökväg, även när skriptet finns i den aktuella katalogen. Mer information om hur du kör kommandon och skript i PowerShell finns i about_Command_Precedence.

Kör med PowerShell

Från och med PowerShell 3.0 kan du köra skript från Istraživač datoteka.

Så här använder du funktionen "Kör med PowerShell":

Kör Istraživač datoteka, högerklicka på skriptfilens namn och välj sedan "Kör med PowerShell".

Funktionen "Kör med PowerShell" är utformad för att köra skript som inte har nödvändiga parametrar och inte returnerar utdata till kommandotolken.

Mer information finns i about_Run_With_PowerShell.

Köra skript på andra datorer

Om du vill köra ett skript på en eller flera fjärrdatorer använder du parametern FilePath för cmdleten Invoke-Command .

Ange sökvägen och filnamnet för skriptet som värdet för FilePath-parametern . Skriptet måste finnas på den lokala datorn eller i en katalog som den lokala datorn kan komma åt.

Följande kommando kör skriptet Get-ServiceLog.ps1 på fjärrdatorerna med namnet Server01 och Server02.

Invoke-Command -ComputerName Server01,Server02 -FilePath `
  C:\Scripts\Get-ServiceLog.ps1

Få hjälp med skript

Cmdleten Get-Help hämtar hjälpavsnitten för skript samt för cmdletar och andra typer av kommandon. Om du vill hämta hjälpavsnittet för ett skript skriver du Get-Help följt av sökvägen och filnamnet för skriptet. Om skriptsökvägen finns i miljövariabeln Path kan du utelämna sökvägen.

Om du till exempel vill få hjälp med ServicesLog.ps1-skriptet skriver du:

get-help C:\admin\scripts\ServicesLog.ps1

Skriva ett skript

Ett skript kan innehålla alla giltiga PowerShell-kommandon, inklusive enkla kommandon, kommandon som använder pipelinen, funktioner och kontrollstrukturer som If-instruktioner och For-loopar.

Om du vill skriva ett skript öppnar du en ny fil i en textredigerare, skriver kommandona och sparar dem i en fil med ett giltigt filnamn med filnamnstillägget .ps1 .

Följande exempel är ett enkelt skript som hämtar de tjänster som körs i det aktuella systemet och sparar dem i en loggfil. Loggfilnamnet skapas från det aktuella datumet.

$date = (get-date).dayofyear
get-service | out-file "$date.log"

Om du vill skapa det här skriptet öppnar du en textredigerare eller en skriptredigerare, skriver dessa kommandon och sparar dem sedan i en fil med namnet ServiceLog.ps1.

Parametrar i skript

Om du vill definiera parametrar i ett skript använder du en Param-instruktion. -instruktionen Param måste vara den första instruktionen i ett skript, förutom kommentarer och instruktioner #Require .

Skriptparametrar fungerar som funktionsparametrar. Parametervärdena är tillgängliga för alla kommandon i skriptet. Alla funktioner i funktionsparametrar, inklusive parameterattributet och dess namngivna argument, är också giltiga i skript.

När skriptet körs skriver skriptanvändare parametrarna efter skriptnamnet.

I följande exempel visas ett Test-Remote.ps1 skript som har en ComputerName-parameter . Båda skriptfunktionerna har åtkomst till parametervärdet ComputerName .

param ($ComputerName = $(throw "ComputerName parameter is required."))

function CanPing {
   $error.clear()
   $tmp = test-connection $computername -erroraction SilentlyContinue

   if (!$?)
       {write-host "Ping failed: $ComputerName."; return $false}
   else
       {write-host "Ping succeeded: $ComputerName"; return $true}
}

function CanRemote {
    $s = new-pssession $computername -erroraction SilentlyContinue

    if ($s -is [System.Management.Automation.Runspaces.PSSession])
        {write-host "Remote test succeeded: $ComputerName."}
    else
        {write-host "Remote test failed: $ComputerName."}
}

if (CanPing $computername) {CanRemote $computername}

Om du vill köra det här skriptet skriver du parameternamnet efter skriptnamnet. Till exempel:

C:\PS> .\test-remote.ps1 -computername Server01

Ping succeeded: Server01
Remote test failed: Server01

Mer information om Param-instruktionen och funktionsparametrarna finns i about_Functions och about_Functions_Advanced_Parameters.

Skriva hjälp för skript

Du kan skriva ett hjälpavsnitt för ett skript med någon av följande två metoder:

  • Kommentarsbaserad hjälp för skript

    Skapa ett hjälpavsnitt med hjälp av särskilda nyckelord i kommentarerna. Om du vill skapa kommentarsbaserad hjälp för ett skript måste kommentarerna placeras i början eller slutet av skriptfilen. Mer information om kommentarsbaserad hjälp finns i about_Comment_Based_Help.

  • XML-baserad hjälp för skript

    Skapa ett XML-baserat hjälpavsnitt, till exempel den typ som vanligtvis skapas för cmdletar. XML-baserad hjälp krävs om du översätter hjälpavsnitt till flera språk.

Om du vill associera skriptet med det XML-baserade hjälpavsnittet använder du . ExternalHelp Hjälp kommentera nyckelord. Mer information om nyckelordet ExternalHelp finns i about_Comment_Based_Help. Mer information om XML-baserad hjälp finns i Så här skriver du cmdlethjälp.

Returnerar ett slutvärde

Skript returnerar som standard inte någon avslutsstatus när skriptet slutar. Du måste använda -instruktionen exit för att returnera en slutkod från ett skript. Som standard returnerar 0-instruktionen exit . Du kan ange ett numeriskt värde för att returnera en annan utgångsstatus. En icke-nollavslutskod signalerar vanligtvis ett fel.

I Windows tillåts valfritt tal mellan [int]::MinValue och [int]::MaxValue .

På Unix tillåts endast positiva tal mellan [byte]::MinValue (0) och [byte]::MaxValue (255). Ett negativt tal i intervallet -1 för genom -255 omvandlas automatiskt till ett positivt tal genom att lägga till 256. Omvandlas till exempel -2 till 254.

I PowerShell anger -instruktionen exit värdet för variabeln $LASTEXITCODE . I Windows Command Shell (cmd.exe) anger exit-instruktionen värdet för %ERRORLEVEL% miljövariabeln.

Alla argument som inte är numeriska eller utanför det plattformsspecifika intervallet översätts till värdet 0för .

Skriptomfång och punktkällor

Varje skript körs i sitt eget omfång. De funktioner, variabler, alias och enheter som skapas i skriptet finns bara i skriptomfånget. Du kan inte komma åt dessa objekt eller deras värden i det omfång där skriptet körs.

Om du vill köra ett skript i ett annat omfång kan du ange ett omfång, till exempel Globalt eller Lokalt, eller så kan du pricka skriptet.

Med funktionen dot sourcing kan du köra ett skript i det aktuella omfånget i stället för i skriptomfånget. När du kör ett skript som är punktkälla körs kommandona i skriptet som om du hade skrivit dem i kommandotolken. De funktioner, variabler, alias och enheter som skriptet skapar skapas i det omfång som du arbetar i. När skriptet har körts kan du använda de skapade objekten och komma åt deras värden i sessionen.

Om du vill pricka ett skript skriver du en punkt (.) och ett blanksteg före skriptsökvägen.

Till exempel:

. C:\scripts\UtilityFunctions.ps1

eller

. .\UtilityFunctions.ps1

När skriptet UtilityFunctions.ps1 har körts läggs de funktioner och variabler som skriptet skapar till i det aktuella omfånget.

Skriptet UtilityFunctions.ps1 skapar New-Profile till exempel funktionen och variabeln $ProfileName .

#In UtilityFunctions.ps1

function New-Profile
{
  Write-Host "Running New-Profile function"
  $profileName = split-path $profile -leaf

  if (test-path $profile)
    {write-error "Profile $profileName already exists on this computer."}
  else
    {new-item -type file -path $profile -force }
}

Om du kör skriptet UtilityFunctions.ps1 i ett eget skriptomfång New-Profile finns funktionen och variabeln $ProfileName bara när skriptet körs. När skriptet avslutas tas funktionen och variabeln bort, enligt följande exempel.

C:\PS> .\UtilityFunctions.ps1

C:\PS> New-Profile
The term 'new-profile' is not recognized as a cmdlet, function, operable
program, or script file. Verify the term and try again.
At line:1 char:12
+ new-profile <<<<
   + CategoryInfo          : ObjectNotFound: (new-profile:String) [],
   + FullyQualifiedErrorId : CommandNotFoundException

C:\PS> $profileName
C:\PS>

När du prickar skriptet och kör det skapar skriptet New-Profile funktionen och variabeln $ProfileName i sessionen i omfånget. När skriptet har körts kan du använda New-Profile funktionen i sessionen, som du ser i följande exempel.

C:\PS> . .\UtilityFunctions.ps1

C:\PS> New-Profile

    Directory: C:\Users\juneb\Documents\WindowsPowerShell

    Mode    LastWriteTime     Length Name
    ----    -------------     ------ ----
    -a---   1/14/2009 3:08 PM      0 Microsoft.PowerShellISE_profile.ps1

C:\PS> $profileName
Microsoft.PowerShellISE_profile.ps1

Mer information om omfång finns i about_Scopes.

Skript i moduler

En modul är en uppsättning relaterade PowerShell-resurser som kan distribueras som en enhet. Du kan använda moduler för att organisera skript, funktioner och andra resurser. Du kan också använda moduler för att distribuera koden till andra och för att hämta kod från betrodda källor.

Du kan inkludera skript i dina moduler eller skapa en skriptmodul, som är en modul som helt eller främst består av ett skript och stödresurser. En skriptmodul är bara ett skript med filnamnstillägget .psm1.

Mer information om moduler finns i about_Modules.

Andra skriptfunktioner

PowerShell har många användbara funktioner som du kan använda i skript.

  • #Requires – Du kan använda en #Requires instruktion för att förhindra att ett skript körs utan angivna moduler eller snapin-moduler och en angiven version av PowerShell. Mer information finns i about_Requires.

  • $PSCommandPath – Innehåller den fullständiga sökvägen och namnet på skriptet som körs. Den här parametern är giltig i alla skript. Den här automatiska variabeln introduceras i PowerShell 3.0.

  • $PSScriptRoot – Innehåller katalogen som ett skript körs från. I PowerShell 2.0 är den här variabeln endast giltig i skriptmoduler (.psm1). Från och med PowerShell 3.0 är det giltigt i alla skript.

  • $MyInvocation – Den $MyInvocation automatiska variabeln innehåller information om det aktuella skriptet, inklusive information om hur det startades eller "anropades". Du kan använda den här variabeln och dess egenskaper för att hämta information om skriptet medan det körs. Till exempel $MyInvocation. Variabeln MyCommand.Path innehåller sökvägen och filnamnet för skriptet. $MyInvocation. Raden innehåller kommandot som startade skriptet, inklusive alla parametrar och värden.

    Från och med PowerShell 3.0 $MyInvocation har två nya egenskaper som ger information om skriptet som anropade eller anropade det aktuella skriptet. Värdena för dessa egenskaper fylls bara i när anroparen eller anroparen är ett skript.

    • PSCommandPath innehåller den fullständiga sökvägen och namnet på skriptet som anropade eller anropade det aktuella skriptet.

    • PSScriptRoot innehåller katalogen för skriptet som anropade eller anropade det aktuella skriptet.

    Till skillnad från variablerna $PSCommandPath och $PSScriptRoot , som innehåller information om det aktuella skriptet, innehåller egenskaperna PSCommandPath och PSScriptRoot för variabeln $MyInvocation information om skriptet som kallade det aktuella skriptet.

  • Dataavsnitt – Du kan använda nyckelordet Data för att separera data från logik i skript. Dataavsnitt kan också göra lokalisering enklare. Mer information finns i about_Data_Sections och about_Script_Internationalization.

  • Skriptsignering – Du kan lägga till en digital signatur i ett skript. Beroende på körningsprincipen kan du använda digitala signaturer för att begränsa körningen av skript som kan innehålla osäkra kommandon. Mer information finns i about_Execution_Policies och about_Signing.

Se även