about_PowerShell_exe

简短说明

介绍如何使用 powershell.exe 命令行接口。 显示命令行参数并介绍语法。

长说明

有关 PowerShell 7 的命令行选项的信息,请参阅 about_Pwsh

SYNTAX

PowerShell[.exe]
    [-PSConsoleFile <file> | -Version <version>]
    [-NoLogo]
    [-NoExit]
    [-Sta]
    [-Mta]
    [-NoProfile]
    [-NonInteractive]
    [-InputFormat {Text | XML}]
    [-OutputFormat {Text | XML}]
    [-WindowStyle <style>]
    [-EncodedArguments <Base64EncodedArguments>]
    [-EncodedCommand <Base64EncodedCommand>]
    [-ConfigurationName <string>]
    [-File - | <filePath> <args>]
    [-ExecutionPolicy <ExecutionPolicy>]
    [-Command - | { <script-block> [-args <arg-array>] }
                | { <string> [<CommandParameters>] } ]

PowerShell[.exe] -Help | -? | /?

参数

-Command

执行指定的命令(和所有参数),就像从 PowerShell 命令提示符下键入的命令一样,如果未指定 NoExit 参数,则随后退出。

Command 的值可以是“-”、脚本块或字符串。 如果 Command 的值为“-”,则将从标准输入读取命令文本。

Command 参数只有在能够将传递给 Command 的值识别为 ScriptBlock 类型时,才接受用于执行的脚本块。 这只有在从另一个 PowerShell 主机运行 powershell.exe 时才有可能。 ScriptBlock 类型可以包含在现有变量中,可以从表达式返回,也可以由 PowerShell 主机解析为括在大括号 {} 中的文字脚本块,然后再传递给 powershell.exe

powershell -Command {Get-WinEvent -LogName security}

cmd.exe 中,不存在脚本块(或 ScriptBlock 类型),因此传递给 Command 的值将始终是一个字符串。 可以在字符串中编写一个脚本块,但它不会被执行,该脚本块的行为与你在典型 PowerShell 提示符中键入它的行为完全相同,即将脚本块内容输出出来返还给你。

传递给 Command 的字符串仍将作为 PowerShell 代码执行,因此从 cmd.exe 运行脚本块时通常一开始不需要大括号。 要执行在字符串中定义的内联脚本块,可以使用调用操作符&

powershell.exe -Command "& {Get-WinEvent -LogName security}"

如果 Command 的值是字符串,Command 必须是 pwsh 的最后一个参数,因为其后面的所有参数都解释为要执行的命令的一部分。

从现有 PowerShell 会话中调用时,结果将作为反序列化的 XML 对象(而不是实时对象)返回到父级 shell。 对于其他 shell,结果将作为字符串返回。

如果 Command 的值为“-”,则将从标准输入读取命令文本。 在将 Command 参数与标准输入配合使用时,必须重定向标准输入。 例如:

@'
"in"

"hi" |
  % { "$_ there" }

"out"
'@ | powershell -NoProfile -Command -

该示例产生下面的输出:

in
hi there
out

进程退出代码由脚本块中最后一个(已执行)命令的状态确定。 当 $?$true 时,退出代码为 0;当 $?$false 时,退出代码为 1。 如果最后一个命令是外部程序或 PowerShell 脚本,该脚本明确设置除 01以外的退出代码,则退出代码将转换为进程退出代码的 1。 若要保留特定的退出代码,请将 exit $LASTEXITCODE 添加到命令字符串或脚本块。

有关详细信息,请参阅 about_Automatic_Variables 中的 $LASTEXITCODE

同样,当发生脚本终止 (runspace-terminating) 错误(如 throw-ErrorAction Stop)时,或者执行被 Ctrl+C 中断时,将返回数值“1”。

-ConfigurationName <string>

指定运行 PowerShell 的配置终结点。 可以是在本地计算机上注册的任何终结点,包括默认 PowerShell 远程处理终结点或具有特定用户角色功能的自定义终结点。

-EncodedArguments <Base64EncodedArguments>

接受命令参数的 Base64 编码字符串版本。 使用此参数提交需要复杂嵌套引用的参数。 Base64 表示形式必须是 UTF-16LE 编码的字符串。

-EncodedCommand <Base64EncodedCommand>

接受命令的 base-64 编码字符串版本。 使用此参数将命令提交到需要复杂的引号或大括号的 PowerShell。 必须使用 UTF-16LE 字符编码设置字符串的格式。

-ExecutionPolicy <ExecutionPolicy>

为当前会话设置默认执行策略,并将其保存在 $env:PSExecutionPolicyPreference 环境变量中。 此参数不会更改在注册表中设置的 PowerShell 执行策略。 若要了解 PowerShell 执行策略(包括有效值列表),请参阅 about_Execution_Policies

-File - | <filePath><args>

如果 File 的值为“-”,则将从标准输入读取命令文本。 在没有重定向的标准输入的情况下运行 powershell -File - 将启动常规会话。 这相当于完全不指定 File 参数。

如果 File 的值是文件路径,则新会话的本地作用域中运行指定的脚本(“dot-sourced”),以便脚本创建的函数和变量在新会话中可用。 输入脚本文件路径和任何参数。 “文件”必须是命令中的最后一个参数。 在 File 参数之后键入的所有值都被视为脚本文件路径和传递到该脚本的参数。

传递给脚本的参数作为文字字符串(在当前 shell 的解释后)传递。 例如,如果处于 cmd.exe 中,并且想要传递环境变量值,请使用 cmd.exe 语法:powershell.exe -File .\test.ps1 -TestParam %windir%

相反,在 cmd.exe 中运行 powershell.exe -File .\test.ps1 -TestParam $env:windir 会导致脚本接收文本字符串 $env:windir,因为它对当前 cmd.exe shell 没有特殊意义。 环境变量引用的 $env:windir 样式可以Command 参数中使用,因为在那里它将会被解释为 PowerShell 代码。

同样,如果要从 Batch 脚本执行相同的命令,则可以使用 %~dp0 而不是 .\$PSScriptRoot 来表示当前执行目录:powershell.exe -File %~dp0test.ps1 -TestParam %windir%。 如果改用 .\test.ps1,PowerShell 会引发错误,因为找不到文本路径 .\test.ps1

如果 File 的值是文件路径,则 File必须是命令中的最后一个参数,因为在 File 参数名称后键入的任何字符都会被解释为后跟脚本参数的脚本文件路径。

File 参数的值中可以包括脚本参数和值。 例如:-File .\Get-Script.ps1 -Domain Central

通常,将包括或忽略脚本的开关参数。 例如,下面的命令使用 Get-Script.ps1 脚本文件的 All 参数:-File .\Get-Script.ps1 -All

在极少数情况下,你可能需要为参数提供一个布尔值。 以这种方式运行脚本时,无法为开关参数传递显式布尔值。 此限制在 PowerShell 6 (pwsh.exe) 中已被移除。

注意

File 参数不支持使用需要参数值数组的参数的脚本。 遗憾的是,本机命令如何获取参数值是一个限制。 调用本机可执行文件(如 powershellpwsh),系统不知道该如何处理数组,因此将其作为字符串传递。

当脚本文件以 exit 命令终止时,进程退出代码将设置为与 exit 命令一起使用的数字参数。 正常终止时,退出代码始终为 0

有关详细信息,请参阅 about_Automatic_Variables 中的 $LASTEXITCODE

-InputFormat {文本 |XML}

描述发送到 PowerShell 的数据格式。 有效值为“Text”(文本字符串)或“XML”(序列化 CLIXML 格式)。

-Mta

使用多线程单元启动 PowerShell。 此参数是在 PowerShell 3.0 中引入的。 在 PowerShell 2.0 中,多线程单元 (MTA) 是默认设置。 在 PowerShell 3.0 中,单线程单元 (STA) 是默认设置。

-NoExit

运行启动命令后不退出。

-NonInteractive

此开关用于创建不应要求用户输入的会话。 这对于在计划任务或 CI/CD 管道中运行的脚本非常有用。 任何尝试使用交互式功能(如 Read-Host 或确认提示)都会导致语句终止错误而不是挂起。

启动时隐藏版权横幅。

-NoProfile

不加载 PowerShell 配置文件。

-OutputFormat {文本 | XML}

确定 PowerShell 输出内容的格式。 有效值为“Text”(文本字符串)或“XML”(序列化 CLIXML 格式)。

-PSConsoleFile <FilePath>

加载指定的 PowerShell 控制台文件。 输入控制台文件的路径和名称。 若要创建控制台文件,请使用 PowerShell 中的 Export-console cmdlet。

-Sta

使用单线程单元启动 PowerShell。 在 Windows PowerShell 2.0 中,多线程单元 (MTA) 是默认设置。 在 Windows PowerShell 3.0 中,单线程单元 (STA) 是默认设置。

-版本 <PowerShell 版本>

启动 PowerShell 的指定版本。 有效值为 2.0 和 3.0。 必须在系统上安装指定的版本。 如果计算机上安装 Windows PowerShell 3.0,则“3.0”是默认版本。 否则,“2.0”是默认版本。 有关更多信息,请参阅安装 PowerShell

-WindowStyle <Window 样式>

为会话设置窗口样式。 有效值为 NormalMinimizedMaximizedHidden

-Help、-?、/?

显示针对 PowerShell.exe 的帮助。 如果要在 PowerShell 会话中键入 PowerShell.exe 命令,请以连字符 (-) 作为命令参数的前缀,不要使用正斜杠 (/)。 你可以在 cmd.exe 中使用连字符或正斜杠。

REMARKS

疑难解答注释:在 PowerShell 2.0 中,在 PowerShell 控制台中启动某些程序将失败,LastExitCode 为 0xc0000142。

示例

# Create a new PowerShell session and load a saved console file
PowerShell -PSConsoleFile sqlsnapin.psc1

# Create a new PowerShell V2 session with text input, XML output, and no logo
PowerShell -Version 2.0 -NoLogo -InputFormat text -OutputFormat XML

# Execute a PowerShell Command in a session
PowerShell -Command "Get-EventLog -LogName security"

# Run a script block in a session
PowerShell -Command {Get-EventLog -LogName security}

# An alternate way to run a command in a new session
PowerShell -Command "& {Get-EventLog -LogName security}"

# To use the -EncodedCommand parameter:
$command = "dir 'c:\program files' "
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
powershell.exe -encodedCommand $encodedCommand