PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
将自变量传递到本机命令
大多数 shell 包括用于使用变量、计算表达式和处理字符串的功能。 但每个 shell 都以不同的方式执行这些操作。 在 PowerShell 中,所有参数都以连字符 (-
) 字符开头。 在 cmd.exe
中,大多数参数使用斜杠 (/
) 字符。 其他命令行工具可能没有用于参数的特殊字符。
每个 shell 以其自己的方式在命令行上处理和计算字符串。 在 PowerShell 中运行需要以特定方式引用字符串的本机命令时,可能需要调整传递这些字符串的方式。
有关详细信息,请参阅以下文章:
about_Parsing
about_Quoting_Rules
PowerShell 7.2 引入了一项新的实验性功能 PSnativeCommandArgumentPassing
,它改进了本机命令处理。 有关详细信息,请参阅 PSnativeCommandArgumentPassing。
处理输出和错误
PowerShell 的输出流也比其他 shell 多。 bash
和 cmd.exe
shell 有 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,来将其作为获取额外信息的备用流。 查找错误时,此行为可能会在 PowerShell 中导致混淆,如果将 $ErrorActionPreference
设置为静音输出的状态,则可能会丢失额外的输出信息。
PowerShell 7.3 添加了一项新的实验性功能 PSnativeCommandErrorActionPreference
,可用于控制是否将输出到 stderr
视为错误。 有关详细信息,请参阅 PSnativeCommandErrorActionPreference。
运行 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。