PS2EXE转换后exe报路径非法字符错误,PS1运行正常
解决PS2EXE转换后“路径包含非法字符”及目录获取问题
问题概述
- PowerShell GUI脚本(PS1格式)运行正常,但经PS2EXE转换为exe后出现以下异常:
- 弹出“路径包含非法字符”错误提示
- 后续触发“找不到驱动器”对话框
- 自动显示脚本开头注释或起始代码(移除注释后显示起始代码)
- 脚本需从U盘运行,依赖获取当前程序所在目录,尝试过两种目录获取方法均无效:
# 方式1 $currentDir = [System.IO.Path]::GetDirectoryName([System.Reflection.Assembly]::GetExecutingAssembly().Location)# 方式2 $currentDir = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition - 脚本多处通过
$currentDir构建子路径(如scripts、software等目录),无目录依赖的脚本转exe后可正常运行。
解决方案
1. 替换当前目录获取逻辑
PS2EXE转换后的程序运行时,原两种方法会指向临时解压目录而非U盘里的实际exe目录,改用进程主模块路径获取真实运行目录:
$currentDir = [System.IO.Path]::GetDirectoryName([System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName)
该方法直接读取当前进程的exe路径,不受PS2EXE解压机制影响,能准确获取U盘内的程序所在目录。
2. 优化PS2EXE转换参数
针对GUI脚本,转换时添加-noConsole参数隐藏控制台,避免脚本内容被意外输出:
ps2exe.ps1 -inputFile YourScript.ps1 -outputFile YourScript.exe -noConsole
3. 增加路径合法性校验
在使用$currentDir构建子路径前,添加校验逻辑,提前拦截无效路径导致的错误:
# 检查目录是否有效且为绝对路径 if (-not $currentDir -or -not [System.IO.Path]::IsPathRooted($currentDir)) { [System.Windows.Forms.MessageBox]::Show("无法获取有效运行目录,请确保程序从U盘正常启动", "错误", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Error) exit } # 构建子路径 $scriptPath = Join-Path -Path $currentDir -ChildPath "scripts" $softwarePath = Join-Path -Path $currentDir -ChildPath "software" $webShortcutsPath = Join-Path -Path $currentDir -ChildPath "WebShortcuts" $formtoolsPath = Join-Path -Path $currentDir -ChildPath "formtools"
4. 打包依赖资源(可选)
如果脚本依赖同目录下的子目录或文件,转换时使用-copyFiles参数将这些资源打包到exe中,避免运行时找不到文件:
ps2exe.ps1 -inputFile YourScript.ps1 -outputFile YourScript.exe -noConsole -copyFiles "scripts","software","WebShortcuts","formtools"
内容的提问来源于stack exchange,提问作者user22828697
相关产品推荐
相关产品推荐

