PowerShell脚本转EXE后功能正常但上传时显示错误信息
问题分析
你的PowerShell脚本编译为EXE后,文件上传成功但显示带ERROR:前缀的进度信息,根源在于:az storage blob upload的进度提示是通过**标准错误流(stderr)**输出的,而ps2exe编译后的程序会将所有stderr内容自动添加ERROR:前缀显示,但这些进度行并非真正的错误,只是az CLI的进度反馈。
解决方案
以下两种方案可解决问题,同时保留进度提示:
方案一:处理az输出,分离进度与错误
修改脚本中的上传命令部分,通过捕获输出并过滤,让进度正常显示,仅真正的错误才标记为错误:
# 替换原脚本中的az上传命令为以下代码 # 启动az上传进程,重定向输出到临时文件 $uploadArgs = "storage blob upload --file `"$FilePath`" --account-name $accountName --container-name $containerName/XXXX/ --auth-mode login --overwrite" $uploadProcess = Start-Process az -ArgumentList $uploadArgs -NoNewWindow -PassThru -RedirectStandardError ".\az_stderr.tmp" -RedirectStandardOutput ".\az_stdout.tmp" # 实时读取并显示进度 while (!$uploadProcess.HasExited) { # 读取最新的进度行 $latestLine = Get-Content ".\az_stderr.tmp" -Tail 1 if ($latestLine -match 'Alive\[.*\] \d+\.\d+%') { # 使用`r实现进度行覆盖,避免刷屏 Write-Host "`r$latestLine" -NoNewline } Start-Sleep -Milliseconds 100 } # 完成后换行,显示最终输出 Write-Host "" Get-Content ".\az_stdout.tmp" # 检查并输出真正的错误 $allStdErr = Get-Content ".\az_stderr.tmp" $realErrors = $allStdErr | Where-Object { $_ -notmatch 'Alive\[.*\] \d+\.\d+%' -and $_ -ne "" } if ($realErrors) { Write-Error "上传错误:`n$($realErrors -join "`n")" } # 清理临时文件 Remove-Item ".\az_stderr.tmp", ".\az_stdout.tmp" -ErrorAction SilentlyContinue
方案二:简化重定向输出(快速解决)
如果不需要严格区分错误和进度,可直接将az的stderr重定向到stdout,并用Write-Host输出,避免ps2exe添加ERROR:前缀:
# 替换原az上传命令 az storage blob upload --file $FilePath --account-name $accountName --container-name $containerName/XXXX/ --auth-mode login --overwrite 2>&1 | ForEach-Object { Write-Host $_ }
验证方法
修改脚本后,重新使用原编译命令生成EXE:
ps2exe .\Upload-Files-To-Blob.ps1 Test-Upload.exe -iconFile "upload_icon.ico" -title "Test Upload Utility" -copyright "Copyright (C) 2024" -version "1.0" -verbose
双击运行EXE后,进度信息会正常显示,不再带有ERROR:前缀。
内容的提问来源于stack exchange,提问作者JT-66
相关产品推荐
相关产品推荐

