如何强制使用 Win-PS2EXE 编译的 EXE Powershell 脚本在 Powershell 7 上运行

问题描述 投票:0回答:2

我有一个 PowerShell 脚本,我使用 Win-PS2EXE 将其转换为 EXE。问题是我正在使用

Foreach -parallel
并且它不能与 PowerShell 5.0 一起使用,我需要这个 EXE 使用最新的 shell 运行,并且我已经尝试使用
#Requires -Version 7.0
并且它仍然与旧版本一起运行。

尝试过: #需要-版本7.0 #需要 -PSEdition 桌面版

powershell foreach parallel.foreach powershell-core
2个回答
1
投票

PS2EXE
及其 GUI 前端
Win-PS2EXE
,设计为 仅适用于 Windows PowerShell(传统的 Windows 附带的 Windows 版本) PowerShell 的最新版本是 5.1),以及也适用于PowerShell(核心)7(现代、跨平台、按需安装版本),至少在撰写本文时是这样。

    编译的可执行文件需要在运行时存在兼容的 Windows PowerShell 版本,因为可执行文件不是完全独立的。
  • 从这个意义上说,基于
  • Windows PowerShell

    进行构建只有一个优势:后者保证出现在目标计算机上,这与 PowerShell (Core) 7不同。


如果您可以假设在必须运行可执行文件的所有计算机上都存在 PowerShell(核心)7,则有一个 - 低效 - 解决方法

    从您正在编译的脚本中,调用
  • pwsh.exe

    (PowerShell (Core) 7 
    CLI),通过 脚本块传递要执行的代码,如下所示。

    由于创建另一个子进程的开销,这总是会减慢执行速度。
  • 下面的示例脚本假设
  • pwsh.exe

    可通过

    $env:PATH
    发现,因此仅使用文件
    name

      如果情况并非如此,或者您想要对可执行文件的路径进行硬编码以实现可预测性,请使用完整路径,并通过
    • call 运算符

      调用它;例如,要启动 winget 安装的副本:

      & $env:LOCALAPPDATA\Microsoft\WindowsApps\pwsh.exe -NoProfile { ... }
      

      
      
示例源代码脚本:

# Content of a sample *.ps1 file to be compile with Invoke-ps2exe # Execute PowerShell (Core) 7 code via a call to its CLI, pwsh.exe pwsh.exe -NoProfile { # Place your PowerShell (Core) 7 code here. # ... # Sample command that uses ForEach-Object -Parallel 1..3 | ForEach-Object -Parallel { "ID of thread #${_}: " + [System.Threading.Thread]::CurrentThread.ManagedThreadId } } # Pass pwsh.exe's exit code through exit $LASTEXITCODE



-1
投票

# At beginning of .ps1 if ($PSVersionTable.PSVersion -ne [Version]"7.0") { # Re-launch as version 7 if we're not already powershell -Version 7.0 -File $MyInvocation.MyCommand.Definition exit } # Your script code

但是,例如对于 Powershell 7.2.4,正确的语法是:

#Requires -Version <N>[7.2.24.<n>]

	
© www.soinside.com 2019 - 2024. All rights reserved.