如何从命令行运行 PowerShell 脚本以及更多

如果您是初次接触 PowerShell 脚本语言,并想学习如何运行 PowerShell 脚本,您来对了博客文章。这篇博客将是一个教程,涵盖了运行脚本的常见方法以及可能出现的一些问题。

先决条件

本文将为您介绍如何在本地计算机上运行 PowerShell。如果您想跟着学,请确保在开始本文之前已经具备以下先决条件。

  • A Windows 10 computer with Administrator privileges.
  • Windows PowerShell 版本 5 或更高版本。您也可以使用 PowerShell v7。本教程将重点介绍 Windows PowerShell,因为 Windows 操作系统已经预装了它。
  • 任何文本文件编辑器

处理执行策略

如果这是您第一次尝试执行 Windows PowerShell 脚本,您可能会遇到一个常见问题。PowerShell 可能会返回一个错误消息,指出脚本“无法加载,因为在此系统上禁止运行脚本”。

PS> .\GetServices.ps1
 File C:\Temp\GetServices.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at
 https:/go.microsoft.com/fwlink/?LinkID=135170.
 At line:1 char:1
 .\GetServices.ps1
 ~~~~~ CategoryInfo          : SecurityError: (:) [], PSSecurityException
 FullyQualifiedErrorId : UnauthorizedAccess   

PowerShell在执行策略设置为RestrictedRemote SignedAll Signed时返回上述错误消息。

Restricted

是Windows客户端计算机的默认策略集。如果您第一次使用PowerShell,您的默认策略可能被设置为限制所有脚本。

您仍然可以在终端中执行单个命令,但不能运行脚本文件。限制包括以.ps1xml.psm1.ps1结尾的任何文件。

Unrestricted

允许您运行任何脚本,但在执行之前会警告您,如果脚本是从互联网下载的。这通常是任何非Windows设备的默认策略。

Remote Signed

Remote Signed策略允许您运行数字签名的脚本,或者在本地计算机上编写的带有或不带有签名的任何脚本。

如果从互联网下载的脚本没有签名,您需要解锁该文件。您可以右键单击文件,选择属性来执行此操作。或者,您可以使用Unblock-File PowerShell cmdlet来解锁特定的脚本文件。

在从互联网下载的脚本中运行时,使用Remote Signed策略是一个理想的选项。

All Signed

All Signed要求所有脚本都由受信任的发布者数字签名。这包括从互联网下载和在本地计算机上编写的脚本。

更改 PowerShell 执行策略

要更改执行策略:

  1. 以管理员身份打开 Windows PowerShell 以确保您具有最高权限来进行策略更改。
Search PowerShell in Start Menu

2. 打开后,运行以下 PowerShell 命令来设置计算机的执行策略。如上所述,执行策略可以是三种不同类型之一。本教程使用了一个既有用又安全的执行策略,即RemoteSigned

由于本教程假定您已从互联网下载了GetServices.ps1脚本文件,请将执行策略设置为RemoteSigned

PS> Set-ExecutionPolicy RemoteSigned

RemoteSigned执行策略会强制您在 PowerShell 在您的系统上运行之前对从互联网下载的每个 PowerShell 脚本进行加密签名。

3. 您应该看到一个输出请求确认操作。输入Y并按回车键确认策略更改。

Execution Policy Change
 The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the
 security risks described in the about_Execution_Policies help topic at https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to
 change the execution policy?
 [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): 

此时,请按照下一步来探索在您的计算机上运行 PowerShell 脚本的不同方法。

如何运行 PowerShell 脚本

要演示运行 PowerShell 脚本,实际上你需要一个脚本文件来运行!如果你手头没有一个,下载这个 ZIP 文件并提取其中的 PS1 文件。你会在里面找到一个名为 GetServices.ps1 的简单脚本文件。

Write-Output "Listing Computer Services"
Get-Service

每个 PowerShell 脚本都应以 .ps1 扩展名结尾。

使用控制台

一旦你准备好一个脚本,你可以以几种不同的方式执行 PowerShell 脚本文件。其中一种最常见的方式是通过 PowerShell 控制台。

要做到这一点:

  1. 打开 PowerShell 控制台如上所示。

2. 使用 Set-Location PowerShell cmdlet 或 cd 别名导航到脚本所在的文件系统位置。本教程的脚本位于 C:\Temp 目录中。

PS> cd C:\Temp\

3. 使用点号 (.) 符号运行脚本。PowerShell 是一个也会查找命令名称的 shell。为了区分 PowerShell 命令和脚本,你必须在脚本前加一个点。这个点表示当前目录。

 PS> .\GetServices.ps1

如何通过 PowerShell 位置从命令行运行 PowerShell 脚本

如果你不能或者宁愿不通过 PowerShell 控制台运行脚本,你也可以通过老式的命令行(命令提示符)来执行。

要通过命令提示符运行脚本,您必须首先启动 PowerShell 可执行文件(powershell.exe),使用 PowerShell 的位置 C:\Program Files\WindowsPowerShell\powershell.exe ,然后将脚本路径作为参数传递给它。

您可以通过在运行 PowerShell 可执行文件时简单地指定参数来在任何上下文中运行带有参数的脚本,例如 powershell.exe -Parameter 'Foo' -Parameter2 'Bar'

一旦您打开 cmd.exe,您就可以执行如下的 PowerShell 脚本。此示例正在运行引擎并将脚本路径作为参数传递给它 C:\Temp\GetServices.ps1

请注意下面的示例正在使用 PowerShell 位置路径来运行脚本。如果文件夹不在您的路径中,则必须执行此操作。

CMD> C:\Program Files\WindowsPowerShell\powershell.exe "C:\Temp\GetServices.ps1"

PowerShell 7 的 PowerShell 位置使用了一个名为 pwsh.exe 的不同可执行文件,通常位于 C:\Program Files\PowerShell\7\pwsh.exe

以下是一个便捷的 YouTube 视频,介绍了通过批处理文件执行脚本的方法,即 cmd.exe 执行。

使用 PowerShell ISE

如果您创建自己的脚本或编辑其他人的脚本,您可能会使用一个脚本编辑器,比如 PowerShell ISE 或者 Visual Studio (VS) Code。由于 ISE 随 Windows 附带,让我们专注于这种方法进行教程。

为调用ISE中的脚本:

  1. 导航到开始菜单,搜索PowerShell ISE并打开。
Search PowerShell ISE in Start Menu

2. 点击文件打开,找到您的脚本。

Open Script using File Menu

3. 打开脚本后,点击绿色运行按钮以执行脚本。此按钮将在底部的内置PowerShell终端中调用脚本。

Run Script using PowerShell ISE

示例脚本的输出

A PowerShell script can sometimes return output. This happens when the script you’re executing is built to return objects which is a fundamental component of PowerShell.

如果运行示例GetServices.ps1脚本,您将看到以下内容。此脚本运行Get-Service cmdlet,返回安装在本地Windows计算机上的所有服务。

PS> .\GetScripts.ps1
Listing Computer Services
Status   Name               DisplayName
------   ----               -----------
Running  aakore             Acronis Agent Core Service
Stopped  AarSvc_1b668d      Agent Activation Runtime_1b668d
Running  AcronisActivePr... Acronis Active Protection Service
Running  AcronisCyberPro... Acronis Cyber Protection Service
Running  AcrSch2Svc         Acronis Scheduler2 Service
Running  AdobeARMservice    Adobe Acrobat Update Service
Running  AdobeUpdateService AdobeUpdateService
Running  AGMService         Adobe Genuine Monitor Service
Running  AGSService         Adobe Genuine Software Integrity Se...
----Truncated----

从脚本内运行PowerShell脚本

假设您有两个脚本,您想让一个调用另一个。也许您有一个名为GetUser.ps1的脚本和一个名为ResetPassword.ps1的脚本。在GetUser.ps1脚本中,您想执行ResetPassword.ps1以重置用户密码。

在调用脚本(GetUser.ps1)中,您会添加一行代码来执行另一个脚本,就像您从命令行调用脚本一样。

您可以看到下面有几个选项。通常,除非有特定原因要在另一个PowerShell会话中运行脚本,否则应选择在相同的会话或范围内运行另一个脚本以简化事务。

## 在新会话中运行另一个脚本
powershell.exe .\ResetPassword.ps1
## 在同一会话中运行另一个脚本
.\ResetPassword.ps1

Source:
https://adamtheautomator.com/run-powershell-script/