我有一个脚本需要以 Powershell 7 身份运行,因为只有 Powershell 7 才有我需要的命令。
当我$PSVersionTable
从 VSCode 运行 .PS1 脚本时,我得到:
Name Value
---- -----
PSVersion 7.0.1
PSEdition Core
当我使用从命令提示符运行相同的 .PS1 脚本时powershell testscript_writefile.ps1
,我得到:
Name Value
---- -----
PSVersion 5.1.14393.3471
PSEdition Desktop
如何执行 Powershell 脚本作为Powershell 7 而不是 Powershell 5?
答案1
赶紧跑
pwsh testscript_writefile.ps1
代替
powershell testscript_writefile.ps1
该powershell
命令启动基于 Windows 专用 .NET 框架的 PowerShell 5。较新的pwsh
版本启动较新的跨平台 .NET 核心版本的 PowerShell(版本 6+)。使用单独的命令可确保powershell
使用该命令时的向后兼容性,并避免脚本和代码示例中的 PowerShell 版本之间产生混淆。
答案2
当您运行脚本时,它将在默认的 OS Powershell 主机中运行,并且在 Windows 上,它将是 Windows PowerShell 的默认操作系统版本,除非您另行明确说明。
如果您想使用 PSCore 运行脚本,请输入...
pwsh [UNC to your script here.]
... 您将 VSCode 配置为使用的默认 PS 版本对操作系统将使用的版本没有影响。
为确保您的代码仅在 PSCore 中尝试运行,您需要在所有脚本的顶部使用 #requires 语句。
about_Requires - PowerShell | Microsoft Docs
这并不意味着您可以在 PSCore 中自动运行,它会抛出一个错误,告诉用户必须使用定义的 PS 版本。因此,他们可以通过启动或输入正确的版本来使用正确的版本运行。
示例脚本中的代码
#Requires -Version 7.0
"Running $PSVersionTable"
运行脚本
PS C:\> $PSVersionTable
<#
#Results
Name Value
---- -----
PSVersion 5.1.18362.752
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.752
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
<#
PS C:\> D:\Scripts\TestForHostVersion.ps1
<#
# Results
D:\Scripts\TestForHostVersion.ps1 : The script 'TestForHostVersion.ps1' cannot be run because it contained a
"#requires" statement for Windows PowerShell 7.0. The version of Windows PowerShell that is required by the script
does not match the currently running version of Windows PowerShell 5.1.18362.752.
At line:1 char:1
+ D:\Scripts\TestForHostVersion.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (TestForHostVersion.ps1:String) [], ScriptRequiresException
+ FullyQualifiedErrorId : ScriptRequiresUnmatchedPSVersion
#>
PS C:\> pwsh -noprofile
<#
# Results
PowerShell 7.0.1
Copyright (c) Microsoft Corporation. All rights reserved.
https://aka.ms/powershell
Type 'help' to get help.
#>
PS C:\> D:\scripts\TestForHostVersion.ps1
<#
# Results
Running System.Management.Automation.PSVersionHashTable
#>
PS C:\> $PSVersionTable
<#
# Results
Name Value
---- -----
PSVersion 7.0.1
PSEdition Core
GitCommitId 7.0.1
OS Microsoft Windows 10.0.18363
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
PS C:\> exit
#>
另一种选择是修复代码以检查主机版本和分支是否正确。例如,我有一个函数,用于根据我想要使用的版本运行代码块。我将其保存在通过我的配置文件导入的模块中,以便始终可用。
Function Start-ConsoleCommand
{
[CmdletBinding(SupportsShouldProcess)]
[Alias('scc')]
Param
(
[string]$ConsoleCommand,
[switch]$PoSHCore
)
If ($PoSHCore)
{Start-Process pwsh -ArgumentList "-NoExit","-Command &{ $ConsoleCommand }" -Wait}
Else
{Start-Process powershell -ArgumentList "-NoExit","-Command &{ $ConsoleCommand }" -Wait}
}
因此,要使用操作系统默认值运行代码……
Start-ConsoleCommand -ConsoleCommand 'some command string'
... 在 PSCore 中运行代码...
Start-ConsoleCommand -ConsoleCommand 'some command string' -PoshCore
你可以做类似的事情。