• Technology
  • March 26, 2026

Run PowerShell Scripts: Execution Policy & Methods Guide

Look, if you're searching how to run Powershell script from Powershell, you've probably hit that frustration wall already. Maybe you double-clicked a .ps1 file and nothing happened, or security errors blocked you mid-project. I've been there too – stranded at 2 AM because my automation script refused to cooperate. Today we'll fix that permanently.

Why Running Scripts Directly in PowerShell Matters

Let's be real: if you're managing Windows systems, you need scripting. Manually typing commands wastes hours. But executing scripts trips people up because:

  • Execution policies lock you out by default
  • Relative paths behave oddly in different contexts
  • Hidden dependencies crash scripts that work in ISE
  • Parameter passing feels like black magic

I once spent three hours debugging a script that failed because I ran it from File Explorer instead of PowerShell. Never again.

Execution Policy: Your First Roadblock

Microsoft locks down script execution by default – smart for security, annoying for productivity. Here's the breakdown:

Policy What It Allows Real-World Use Case
Restricted (Default) Blocks all scripts Kiosks/public machines
AllSigned Only runs signed scripts Corporate environments
RemoteSigned Local scripts run freely Most admin work
Unrestricted Runs everything (risky!) Lab/testing environments

For daily work? Set RemoteSigned:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

This lets you run PowerShell script from PowerShell locally without disabling security entirely. Corporate admins: don't fight GPOs – use signing certificates instead.

Running Scripts: The Right Ways vs. My Mistakes

You've got options, but not all are equal. From my messy experience:

The Classic Dot-Slash Method

.\DiskCleanup.ps1

That backslash matters. Forgot it once and spent 20 minutes wondering why PowerShell couldn't find my script in the same directory. Pro tip: if your path has spaces, wrap it in quotes:

& "C:\My Scripts\purge-old-files.ps1"

Call Operator (&) – Your Unsung Hero

Use this when paths get messy or you're building command strings dynamically:

$scriptPath = Join-Path $env:USERPROFILE "scripts\backup.ps1"
& $scriptPath -Target "D:\backups"

Note: This runs the script in the current scope. Variables inside your script vanish afterward – tripped me up with configuration scripts early on.

Dot-Sourcing for Persistent Changes

Need functions or variables to stick around? Prefix with a dot and space:

. .\Configure-Environment.ps1

Used this for my $profile setup. Life-changing for reusable tools.

Invoke-Expression: Handle With Care

Invoke-Expression -Command "Get-Process | Where CPU -gt 50"

I avoid this unless absolutely necessary. It's like eval() in JavaScript – powerful but dangerous if mishandled. Saw a junior dev wipe a test server with a malformed string once.

Feeling overwhelmed? Bookmark this comparison:

Method When to Use Danger Level
.\script.ps1 Everyday script execution ⭐ (Low)
& "path" Dynamic paths/variables ⭐⭐ (Medium)
Dot-sourcing Loading functions/variables ⭐⭐⭐ (High)
Invoke-Expression Rare dynamic code cases ☠☠☠ (Extreme)

Debugging Nightmares I've Survived (So You Don't Have To)

ExecutionPolicy isn't the only villain. Common errors and fixes:

  • "File cannot be loaded because running scripts is disabled"
  • Fixed with: Set-ExecutionPolicy RemoteSigned

  • "The term 'script.ps1' is not recognized"
  • Translation: PowerShell doesn't know where your file lives. Use full paths or CD to the directory first.

  • Script works in ISE but fails in PowerShell
  • ISE auto-imports modules. Add Import-Module explicitly.

  • Access denied errors on network paths
  • Windows blocks scripts from remote shares. Copy locally or map as drive.

When parameter passing fails (my personal hell):

# Calling script with boolean param WRONG way:
.\Deploy.ps1 -ForceUpdate $true

# RIGHT way (note the colon):
.\Deploy.ps1 -ForceUpdate:$true

That colon syntax? Learned it after 47 failed deployments.

Pro Moves for Heavy Users

Once you master running PowerShell script from PowerShell, try these:

Scheduled Tasks with PowerShell

For automated nightly reports:

$action = New-ScheduledTaskAction -Execute 'pwsh.exe' `
  -Argument '-NoProfile -ExecutionPolicy Bypass -File "D:\scripts\backup.ps1"'
  
Register-ScheduledTask -Action $action -Trigger (New-ScheduledTaskTrigger -Daily -At 2am) `
  -TaskName "NightlyBackup" -User "SYSTEM"

Running as SYSTEM avoids permission issues. The -NoProfile flag prevents slowdowns.

Remote Execution Tricks

Run scripts on servers without RDP:

Invoke-Command -ComputerName SRV01,SRV02 -FilePath "\\nas\scripts\update.ps1"

Protip: Use -Credential parameter for domain admin rights.

Profile Scripts for Efficiency

Add this to $PROFILE to create shortcuts:

function Run-Backup { & "C:\scripts\backup.ps1" @args }

Now just type Run-Backup -Full instead of full paths. Saves my sanity daily.

Security: Don't Be That Admin

PowerShell is powerful. Protect yourself:

  • NEVER run scripts as admin without reading code first
  • Use -WhatIf and -Confirm parameters for destructive operations
  • Validate downloaded scripts with Get-FileHash
  • Set ExecutionPolicy to RemoteSigned (not Unrestricted!)

One sysadmin I know ran a malicious script because it claimed to "clean temp files." Cost his company $200K in ransomware payments. Don't be that guy.

Top Script Execution Questions Answered

Can I run PowerShell script from PowerShell without changing execution policy?

Yes, but it's hacky:

powershell.exe -ExecutionPolicy Bypass -File "C:\Path\script.ps1"

This bypasses the policy temporarily. Useful for one-offs but don't make it habitual – you'll forget when it matters.

Why does my script work in ISE but not in regular PowerShell?

Common culprits:

  • ISE auto-loads modules (Add-PSSnapin happens silently)
  • Different working directories
  • ISE runs 32-bit while PowerShell runs 64-bit (affects COM objects)

Test in both environments. Always.

How to pass parameters when running PowerShell script from PowerShell?

Two methods:

# Positional (order matters):
.\setup.ps1 "Server01" "D:\data"

# Named (safer):
.\setup.ps1 -ComputerName "Server01" -DataPath "D:\data"

Named parameters survive script updates better. Trust me.

Can I run scripts as admin automatically?

Technically yes, but please don't. Elevate only when needed:

if (-not ([Security.Principal.WindowsPrincipal]::new([Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))) {
    Start-Process pwsh.exe "-File `"$PSCommandPath`"" -Verb RunAs
    exit
}

# Admin code here...

This self-elevates. Dangerous but sometimes necessary.

Final Reality Check

Running PowerShell scripts isn't rocket science, but details matter. My prescription:

  1. Set ExecutionPolicy to RemoteSigned once and forget it
  2. Use full paths or navigate to script directories first
  3. Test parameter passing with simple scripts first
  4. Add logging to every script (Start-Transcript saves lives)

Last month I automated a 3-hour daily task with a 20-line script. The payoff is real. Stop fighting execution errors and start building solutions.

Comment

Recommended Article