我有一个 PowerShell 脚本,我使用 Win-PS2EXE 将其转换为 EXE。问题是我正在使用
Foreach -parallel
并且它不能与 PowerShell 5.0 一起使用,我需要这个 EXE 使用最新的 shell 运行,并且我已经尝试使用 #Requires -Version 7.0
并且它仍然与旧版本一起运行。
尝试过: #需要-版本7.0 #需要 -PSEdition 桌面版
PS2EXE
及其 GUI 前端 Win-PS2EXE
,设计为 仅适用于 Windows PowerShell(传统的 Windows 附带的 Windows 版本) PowerShell 的最新版本是 5.1),以及不也适用于PowerShell(核心)7(现代、跨平台、按需安装版本),至少在撰写本文时是这样。
进行构建只有一个优势:后者保证出现在目标计算机上,这与 PowerShell (Core) 7不同。
如果您可以假设在必须运行可执行文件的所有计算机上都存在 PowerShell(核心)7,则有一个 - 低效 - 解决方法:
(PowerShell (Core) 7CLI),通过 脚本块传递要执行的代码,如下所示。 由于创建另一个子进程的开销,这总是会减慢执行速度。
pwsh.exe
可通过
$env:PATH
发现,因此仅使用文件 name。
调用它;例如,要启动 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
# 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>]