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 liknar att köra en cmdlet. Du anger 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, vilket gör det enkelt att dela med andra. Det viktigaste är att du kan köra kommandona genom att helt enkelt skriva skriptsökvägen och filnamnet. Skript kan vara så enkla som ett enda kommando i en fil eller så omfattande som ett komplext program.

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

Så här kör du ett skript

Innan du kan köra ett skript Windows måste du ändra standardkörningsprincipen för PowerShell. Körningsprincipen gäller inte för PowerShell som körs på icke-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.

Använd följande procedur om du vill ändra körningsprincipen.

Skriv följande i kommandotolken:

Set-ExecutionPolicy AllSigned

eller

Set-ExecutionPolicy RemoteSigned

Ändringen börjar gälla omedelbart.

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

Om du till exempel vill Get-ServiceLog.ps1 skriptet i katalogen 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 omsnedstreckssökväg ( .\ ).

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

.\Get-ServiceLog.ps1

Om skriptet har parametrar anger du parametrarna och parametervärdena efter skriptets filnamn.

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

.\Get-ServiceLog.ps1 -ServiceName WinRM

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

Köra med PowerShell

Från och med PowerShell 3.0 kan du köra skript från Utforskaren.

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

Kör Utforskaren, högerklicka på skriptets filnamn 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 Invoke-Command cmdletens FilePath-parameter.

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 Server01 och Server02.

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

Få hjälp med skript

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

Om du till exempel vill få hjälp 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 .ps1 filnamn med filnamnstillägget.

Följande exempel är ett enkelt skript som hämtar de tjänster som körs på det aktuella systemet och sparar dem i en loggfil. Loggfilsnamnet 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. Param-instruktionen måste vara den första instruktionen i ett skript, förutom kommentarer och eventuella #Require -instruktioner.

Skriptparametrar fungerar som funktionsparametrar. Parametervärdena är tillgängliga för alla kommandon i skriptet. Alla funktioner i funktionsparametrar, inklusive attributet Parameter 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 parametern ComputerName. 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. 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:

  • Comment-Based 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-Based hjälp för skript

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

Om du vill associera skriptet med det XML-baserade hjälpavsnittet använder du . Nyckelordet ExternalHelp-hjälpkommentar. Mer information om nyckelordet ExternalHelp finns i about_Comment_Based_Help. Mer information om XML-baserad hjälp finns i How to Write Cmdlet Help.

Returnera ett slutvärde

Som standard returnerar skript inte någon slutstatus när skriptet avslutas. Du måste använda exit -instruktionen för att returnera en slutkod från ett skript. Som standard returnerar exit -instruktionen 0 . Du kan ange ett numeriskt värde för att returnera en annan avslutningsstatus. En slutkod som inte är noll signalerar vanligtvis ett fel.

På Windows tillåts alla tal [int]::MinValue mellan [int]::MaxValue och.

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

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

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

Skriptomfång och punktkällor

Varje skript körs i ett 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 som skriptet körs i.

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 ange en punkt som källa för 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 dot sourced körs kommandona i skriptet som om du hade skrivit dem i kommandotolken. Funktionerna, variablerna, aliasen och enheterna som skriptet skapar skapas i det omfång som du arbetar i. När skriptet har körs kan du använda de skapade objekten och komma åt deras värden i sessionen.

Ange en punkt (.) och ett blanksteg före skriptsökvägen för att punkta ett skript.

Exempel:

. C:\scripts\UtilityFunctions.ps1

eller

. .\UtilityFunctions.ps1

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

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

#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 i ett eget skriptomfång finns funktionen och UtilityFunctions.ps1 New-Profile $ProfileName variabeln bara medan skriptet körs. När skriptet avslutas tas funktionen och variabeln bort, som du ser i 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 använder punktkällan för skriptet och kör det skapar skriptet funktionen New-Profile och $ProfileName variabeln i din session i ditt omfång. När skriptet har körs 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 din kod 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 -instruktion för att förhindra att ett skript körs utan angivna moduler eller #Requires 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 den katalog 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 få information om skriptet medan det körs. Till exempel $MyInvocation . Variabeln MyCommand.Path innehåller skriptets sökväg och filnamn. $MyInvocation. Raden innehåller kommandot som startade skriptet, inklusive alla parametrar och värden.

    Från och med PowerShell 3.0 har två nya egenskaper som ger information om skriptet som anropade $MyInvocation 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 och automatic, som innehåller information om det aktuella skriptet, innehåller $PSCommandPath $PSScriptRoot PSCommandPath- och PSScriptRoot-egenskaperna för variabeln information om skriptet som anropade det $MyInvocation aktuella skriptet.

  • Dataavsnitt – Du kan använda Data nyckelordet för att separera data från logik i skript. Dataavsnitt kan också göra lokaliseringen 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

about_Command_Precedence

about_Comment_Based_Help

about_Execution_Policies

about_Functions

about_Modules

about_Profiles

about_Requires

about_Run_With_PowerShell

about_Scopes

about_Script_Blocks

about_Signing

Invoke-Command