PowerShell 是命令行 shell 和用于自动化的脚本语言。 与其他 shell 类似,例如 bash Linux 或 Windows 命令行界面(cmd.exe),PowerShell 允许你运行系统上可用的任何命令,而不仅仅是 PowerShell 命令。
命令类型
对于任何操作系统中的任何 shell,有三种类型的命令:
Shell 语言关键字 是 shell 脚本语言的一部分。
-
bash关键字的示例包括:if、then、else、elif和fi。 -
cmd.exe关键字的示例包括:dir、copy、move、if和echo。 - PowerShell 关键字的示例包括:
for、foreach、try、catch和trap。
Shell 语言关键字只能在 shell 的运行时环境中使用。 没有提供关键字功能的 shell 外部的可执行文件。
-
操作系统本机命令 是操作系统中安装的可执行文件。 可执行文件可以从任何命令行 shell(如 PowerShell)运行。 这包括需要其他 shell 正常工作的脚本文件。 例如,如果在 PowerShell 中运行 Windows 批处理脚本(
.cmd文件),PowerShell 将运行cmd.exe并传入批处理文件以供执行。shell 环境特定的命令 是在外部文件中定义的命令,这些命令只能在 shell 的运行时环境中使用。 这包括将命令添加到 shell 运行时的脚本、函数和模块。 在 PowerShell 中,模块添加的这些命令称为 cmdlet (发音为“command-lets”)。
运行本机命令
任何本机命令都可以从 PowerShell 命令行运行。 通常,运行命令的方式与 bash 或 cmd.exe完全相同。 以下示例演示如何在 Ubuntu Linux 上的 grep 中运行 bash 命令。
sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
在 Ubuntu 上启动 PowerShell 后,可以从 PowerShell 命令行运行相同的命令:
PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
将参数传递给原生命令
大多数 shell 都包含用于使用变量、计算表达式和处理字符串的功能。 但每个 shell 都以不同的方式执行这些操作。 在 PowerShell 中,所有参数都以连字符(-)字符开头。 在cmd.exe中,大多数命令参数使用正斜杠(/)字符。 其他命令行工具可能使用空格、连字符、双划线(--)。
每个 shell 都有自己的命令行处理和评估字符串的方式。 在 PowerShell 中运行需要以特定方式引用字符串的本机命令时,可能需要调整传递这些字符串的方式。
有关详细信息,请参阅以下文章:
PowerShell 7.2 引入了一项新的实验性功能,PSNativeCommandArgumentPassing 改进了本机命令处理。 有关详细信息,请参阅 $PSNativeCommandArgumentPassing。
处理输出和错误
PowerShell 的输出流数也多于其他 shell。 这 bash 和 cmd.exe 贝壳有 stdout 和 stderr. PowerShell 有六个输出流。 有关详细信息,请参阅 about_Redirection 和 about_Output_Streams。
通常,通过本机命令发送到 stdout 的输出会发送到 PowerShell 中的 Success 流。 通过本机命令发送到 stderr 的输出会发送到 PowerShell 中的 Error 流。
当本机命令具有非零退出代码时, $? 将设置为 $false。 如果退出代码为零,则 $? 设置为 $true。
但是,PowerShell 7.2 更改了此行为。 从本机命令重定向的错误记录(如使用重定向运算符(2>&1)时不会写入 PowerShell 的 $Error 变量,首选项变量 $ErrorActionPreference 不会影响重定向的输出。
许多本机命令写入 stderr 作为获取更多信息的替代流。 如果 $ErrorActionPreference 设置为将输出静音的状态,在查看错误时,此行为可能会导致 PowerShell 中的混淆,并且可能会丢失其他输出信息。
PowerShell 7.3 添加了一项新的实验功能, PSNativeCommandErrorActionPreference 可用于控制如何处理本机命令的非零退出代码。 有关详细信息,请参阅 $PSNativeCommandUseErrorActionPreference。
运行 PowerShell 命令
如前所述,PowerShell 命令称为 cmdlet。 cmdlet 收集在 PowerShell 模块中,可按需加载。 可以使用任何编译的 .NET 语言或使用 PowerShell 脚本语言本身编写 Cmdlet。
运行其他命令的 PowerShell 命令
PowerShell 调用运算符(&)允许运行存储在变量中并由字符串或脚本块表示的命令。 可以使用操作员运行任何本机命令或 PowerShell 命令。 如果需要动态构造本机命令的命令行参数,这在脚本中非常有用。 有关详细信息,请参阅调用运算符。
Start-Process cmdlet 可用于运行本机命令,但仅在需要控制命令的执行方式时使用。 该 cmdlet 具有支持以下方案的参数:
- 使用不同的凭据运行命令
- 隐藏由新进程创建的控制台窗口
- 重定向 stdin, stdout, 和 stderr 流
- 使用不同的工作目录来执行命令
以下示例使用重定向的输入和输出流运行本机命令 sort.exe。
$processOptions = @{
FilePath = "sort.exe"
RedirectStandardInput = "TestSort.txt"
RedirectStandardOutput = "Sorted.txt"
RedirectStandardError = "SortError.txt"
UseNewEnvironment = $true
}
Start-Process @processOptions
有关详细信息,请参阅 Start-Process。
在 Windows 上,Invoke-Item cmdlet 对指定项执行默认操作。 例如,它运行可执行文件,或使用与文档文件类型关联的应用程序打开文档文件。 默认操作取决于项的类型以及提供对项访问权限的 PowerShell 提供程序。
以下示例在默认 Web 浏览器中打开 PowerShell 源代码存储库。
Invoke-Item https://github.com/PowerShell/PowerShell
有关详细信息,请参阅 Invoke-Item。