PowerShell script

Also known as: .ps1

On this page 8

A PowerShell script is a plain-text file with the .ps1 extension that contains PowerShell commands, functions and logic which run in sequence when the file is executed. In PowerShell & command line work on Windows, scripts turn interactive one-liners into repeatable, parameterized automation for tasks such as user provisioning, software deployment, log collection and configuration checks.

Unlike a batch file, a PowerShell script works with .NET objects rather than text, so the output of one cmdlet can be filtered, sorted and passed to the next without parsing strings. Scripts run in either Windows PowerShell 5.1, which ships with Windows, or the cross-platform PowerShell 7, started as pwsh.

How a PowerShell script runs

When a script is invoked, PowerShell parses the whole file first into an abstract syntax tree and only then executes it, so a syntax error anywhere stops the script before the first line runs. Execution then proceeds top to bottom, with functions defined before they are called.

By default a script runs in its own script scope: variables it creates disappear when it ends. Running it with dot-sourcing, as in . .\setup.ps1, executes it in the caller’s scope instead, which is how helper scripts load shared functions into a session.

InvocationExampleBehavior
Relative path.\backup.ps1Runs in the current session, child scope
Dot-sourcing. .\functions.ps1Runs in the caller’s scope
Call operator& 'C:\Tools\My Script.ps1'Runs a path containing spaces
New processpwsh -File .\task.ps1 -Name xSeparate process, used by schedulers
Windows PowerShell hostpowershell.exe -File .\task.ps1Runs under version 5.1
Common ways to start a script

PowerShell does not run scripts from the current directory by name alone; typing backup.ps1 fails unless the folder is in the path. Double-clicking a .ps1 file opens it in an editor by default, a deliberate safety choice.

Structure of a well-written script

Production scripts follow a recognizable layout that makes them self-documenting and safe to reuse. The most important element is the param() block, which turns hard-coded values into named, typed and validated parameters.

ElementPurposeExample
Comment-based helpDocumentation shown by Get-Help.SYNOPSIS and .EXAMPLE sections
#Requires statementMinimum version, modules or admin rights#Requires -Version 7.2
CmdletBinding attributeAdds -Verbose, -WhatIf support[CmdletBinding(SupportsShouldProcess)]
param blockTyped, validated input[ValidateSet('Dev','Prod')]
Error handlingControlled failuretry and catch with -ErrorAction Stop
Exit codeResult for the calling processexit 1 on failure
Building blocks of a script

Supporting -WhatIf is a strong professional signal: it lets an administrator preview changes, such as which accounts would be disabled, before running the script for real.

Execution policy and code signing

The execution policy decides whether scripts may run and whether they must be signed. It is a safety feature, not a security boundary: it prevents accidental execution, but a user can bypass it, for example by pasting the contents into a console.

PolicyEffect on scriptsTypical default
RestrictedNo scripts run, only interactive commandsWindows client editions
RemoteSignedLocal scripts run; downloaded ones need a signatureWindows Server
AllSignedEvery script must be signed by a trusted publisherHigh-assurance environments
UnrestrictedAll run, with a warning for downloaded scriptsNon-Windows platforms
BypassNothing is blocked, no warningsAutomation hosts
Execution policy values and their meaning

A file counts as downloaded when it carries the Mark of the Web, an alternate data stream added by browsers and mail clients. Unblock-File removes it after review. Signing uses Set-AuthenticodeSignature with a code-signing certificate, and any edit to the file invalidates the signature.

The .ps1 extension is one of several PowerShell file types, and choosing the right one affects reuse and distribution.

File typeExtensionBest used for
PowerShell script.ps1A task run from start to end
Script module.psm1Reusable functions imported as a module
Module manifest or data file.psd1Metadata and configuration data
Batch file.bat or .cmdLegacy Command Prompt automation
VBScript file.vbsLegacy automation, being phased out
PowerShell scripts and related formats

A good rule is to move functions into a module once two scripts share them, keeping each .ps1 file a thin orchestration layer.

Running scripts unattended

Many scripts are written to run without anyone at the keyboard: from Task Scheduler, a configuration management agent, a CI pipeline or remotely through PowerShell remoting. Unattended execution changes several assumptions, because no one can answer a prompt or read a red error message on screen.

Robust unattended scripts therefore avoid interactive prompts, write a transcript with Start-Transcript or a structured log, and return a meaningful exit code that the scheduler can evaluate. The account that runs the script matters as much as the code: a task running as SYSTEM has broad local rights but no network identity of a user, while a group managed service account can reach network resources without a stored password.

For remote fleets, Invoke-Command -FilePath .\check.ps1 -ComputerName copies the script content to each target and runs it there, so the file itself does not need to exist on the remote machines. Results come back as deserialized objects, which keeps reporting consistent across hundreds of servers.

Common mistakes and how to avoid them

  • Version mismatch: a script written for PowerShell 7 can fail in 5.1; declare it with #Requires -Version.
  • Silent non-terminating errors: many cmdlets continue after errors; use -ErrorAction Stop inside try blocks.
  • Hard-coded credentials: never store passwords in a script; use a secret store, managed identities or Get-Credential.
  • Encoding problems: non-ASCII characters can break in 5.1 unless the file is saved as UTF-8 with BOM.
  • Blanket Bypass policies: setting Bypass machine-wide removes a useful guard against accidental execution.

A plain-language summary

A PowerShell script is a written list of instructions for Windows. Instead of typing the same ten commands every Monday, an administrator writes them once into a file and runs that file whenever needed.

Because the file can accept options, such as which department or which server, one script can handle many similar jobs. Windows adds a safety rule so that scripts downloaded from the internet do not run by surprise.

An example from practice

An IT administrator at a school with 1,200 student accounts must disable the accounts of graduates every summer. She writes Disable-Graduates.ps1 with a parameter for the graduation year, comment-based help and -WhatIf support, and signs it with the school’s code-signing certificate.

Before the real run, she executes the script with -WhatIf and reviews the 240 accounts it would change. She then runs it from a scheduled task with pwsh -File, and the script writes a CSV log and returns exit code 0 on success. The job that once took a full day of manual clicks finishes in under five minutes, and the log documents every change.