如何从命令提示符以 Powershell 7 形式执行 Powershell 脚本

如何从命令提示符以 Powershell 7 形式执行 Powershell 脚本

我有一个脚本需要以 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

你可以做类似的事情。

相关内容