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 | -? | /?
参数
所有参数都区分大小写。
-File - | <filePath><args>
File 的值可以是-
文件路径和可选参数。 如果文件-
值为,则从标准输入读取命令。
如果 File 的值是文件路径,则新会话的本地作用域中运行指定的脚本(“dot-sourced”),以便脚本创建的函数和变量在新会话中可用。 输入脚本文件路径和任何参数。 文件必须是命令中的最后一个参数。 在 File 参数之后键入的所有值都被视为脚本文件路径和传递到该脚本的参数。 例如:-File .\Get-Script.ps1 -Domain Central
通常,将包括或忽略脚本的开关参数。
例如,下面的命令使用 Get-Script.ps1
脚本文件的 All 参数:-File .\Get-Script.ps1 -All
在极少数情况下,你可能需要为参数提供一个布尔值。
以这种方式运行脚本时,无法为开关参数传递显式布尔值。 此限制在 PowerShell 6 (pwsh.exe
) 中已被移除。
传递给脚本的参数作为文字字符串(在当前 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
来表示当前执行目录:pwsh -File %~dp0test.ps1 -TestParam %windir%
。 如果 .\test.ps1
改用,PowerShell 会引发错误,因为它找不到文本路径 .\test.ps1
注意
File 参数不支持使用需要参数值数组的参数的脚本。 遗憾的是,本机命令如何获取参数值是一个限制。 调用本机可执行文件(如 powershell
或 pwsh
),系统不知道该如何处理数组,因此将其作为字符串传递。
如果文件-
值为,则从标准输入读取命令。
在没有重定向的标准输入的情况下运行 powershell -File -
将启动常规会话。 这相当于完全不指定 File
参数。 从标准输入读取时,输入语句一次执行一个语句,就像在 PowerShell 命令提示符处键入一样。 如果语句分析不正确,则不会执行该语句。 进程退出代码由最后一个(已执行)命令的状态确定。 成功执行后,退出代码始终 0
是。 当脚本文件以 exit
命令终止时,进程退出代码将设置为与 exit
命令一起使用的数字参数。
与 -Command
类似,发生脚本终止错误时,退出代码设置为 1
。 但是,与 -Command
不同的是,当执行中断时,Ctrl+C 退出代码为 0
。 有关详细信息,请参阅 about_Automatic_Variables 中的 $LASTEXITCODE
。
-Command
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
从标准输入进行读取时,将分析并一次执行一个语句,就像在 PowerShell 命令提示符处键入它们一样。 如果输入代码无法正确分析,则不会执行该语句。 除非使用参数 -NoExit
,否则当没有从标准输入读取的输入时,PowerShell 会话将退出。
进程退出代码由输入中最后一个(已执行)命令的状态确定。 当 $?
为 $true
时,退出代码为 0
;当 $?
为 $false
时,退出代码为 1
。 如果最后一个命令是外部程序或 PowerShell 脚本,该脚本明确设置除 0
或 1
以外的退出代码,则退出代码将转换为进程退出代码的 1
。 同样,当发生脚本终止 (runspace-terminating) 错误(如 throw
或 -ErrorAction Stop
)时,或者执行被 Ctrl+C 中断时,将返回数值“1”。
若要保留特定的退出代码,请将 exit $LASTEXITCODE
添加到命令字符串或脚本块。 有关详细信息,请参阅 about_Automatic_Variables 中的 $LASTEXITCODE
。
-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。
-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
或确认提示)都会导致语句终止错误而不是挂起。
-NoLogo
启动时隐藏版权横幅。
-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 样式>
为会话设置窗口样式。 有效值为 Normal
、Minimized
、Maximized
和 Hidden
。
-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