打包为 IExpress 可执行文件的批处理文件无法正常运行
Posted
技术标签:
【中文标题】打包为 IExpress 可执行文件的批处理文件无法正常运行【英文标题】:Batch file wrapped as an IExpress executable does not run properly 【发布时间】:2018-07-18 12:43:25 【问题描述】:我使用iexpress
将.bat
文件包装在.EXE
文件中。
.bat
文件包含在 Windows 上安装我的项目的命令。
我按照所有步骤操作,得到了一个.exe
文件,但是运行时它显示了一个完成的消息,但什么也没做。 (bat 文件内没有命令正在运行).
@echo off
echo %DATE% >> "C:\Users\gaubansa\Desktop\my.txt"
echo %PATH% >> "C:\Users\gaubansa\Desktop\my.txt"
.SED 文件的网络:
[Version]
Class=IEXPRESS
SEDVersion=3
[Options]
PackagePurpose=InstallApp
ShowInstallProgramWindow=1
HideExtractAnimation=0
UseLongFileName=0
InsideCompressed=0
CAB_FixedSize=0
CAB_ResvCodeSigning=0
RebootMode=N
InstallPrompt=%InstallPrompt%
DisplayLicense=%DisplayLicense%
FinishMessage=%FinishMessage%
TargetName=%TargetName%
FriendlyName=%FriendlyName%
AppLaunched=%AppLaunched%
PostInstallCmd=%PostInstallCmd%
AdminQuietInstCmd=%AdminQuietInstCmd%
UserQuietInstCmd=%UserQuietInstCmd%
SourceFiles=SourceFiles
[Strings]
InstallPrompt=Write
DisplayLicense=
FinishMessage=ho gya
TargetName=C:\Users\gaubansa\Desktop\my.EXE
FriendlyName=Write
AppLaunched=cmd.exe /c my_personal.bat
PostInstallCmd=<None>
AdminQuietInstCmd=
UserQuietInstCmd=
FILE0="my_personal.bat"
[SourceFiles]
SourceFiles0=C:\Users\gaubansa\Desktop\
[SourceFiles0]
%FILE0%=
【问题讨论】:
echo off set "workdir=C:\install\my" mkdir %workdir% powershell -Command "(New-Object System.Net.WebClient).DownloadFile('python.org/ftp/python/3.6.1/python-3.6.1.exe', '% workdir%\pyinstaller.exe')" set "python_ver=(not found)" for /f "delims=" %%i in ('python -V') do set python_ver=%%i :: 不要检查输出中的特定版本 - 如果不是 "%python_ver%"=="%python_ver:Python =%" (在系统路径中找到 echo Python。检查 pip ....),否则它存在( echo Python 未正确安装) ! 请检查版本和路径 exit /b ) 感谢您提供额外信息。最好将其编辑到您的问题中(格式很好),这样新人查看您的问题就更容易找到它并帮助您并提高问题的质量;) 我认为它很清楚。 你得到的输出到底是什么? 你有什么错误吗? Iexpress 默认尝试通过 command.com 运行 bat 文件并在现代机器上运行它,您必须使用cmd.exe /c example.bat
调用它
【参考方案1】:
根据您发布的 Iexpress 指令 (.SED) 文件,问题在于您将 Iexpress 配置为使用短文件名将文件名存储在包中,因此您的批处理文件 my_personal.bat
将使用其短文件名存储在包中文件名MY_PER~1.BAT
,但您已指定cmd /c my_personal.bat
来运行您的批处理文件,因此cmd 找不到my_personal.bat
。
要解决这个问题,请在 Iexpress 中选择 Store files using Long File Name inside Package
选项。或者,您可以编辑 SED 文件并将指令 UseLongFileName=0
更改为 UseLongFileName=1
然后在 Iexpress GUI 中选择 Open existing Self Extraction Directive file
一些额外的建议
虽然您的批处理文件名不包含空格或其他特殊字符,但最好将文件名用引号引起来。所以你应该把AppLaunched=cmd.exe /c my_personal.bat
改成AppLaunched=cmd.exe /d /c "my_personal.bat"
/d
开关是可选的,它是为了防止 cmd 执行可能存在 cmd 的 AutoRun 注册表设置的命令。您可以通过在命令提示符下键入CMD /?
来获取有关它的更多信息。
更安全的选择是使用AppLaunched=cmd.exe /d /s /c ""my_personal.bat""
,因此,如果您以后决定重新打包批处理文件并将一些带引号的参数传递给它,您可以这样做,而不会有 cmd 删除基本引号的风险。
例如:cmd.exe /d /s /c ""my_personal.bat" "Quoted Param1" "Quoted Param2" UnquotedParam3"
【讨论】:
谢谢它的工作。我们可以将参数传递给使用 iexpress 创建的 .EXE。 @sst 如何更改/调整 .sed 文件并使用 IExpress 生成可靠且有效的自提升可执行文件(从脚本中触发 UAC 弹出窗口)批处理脚本/实用程序? @VickyDev 你不能通过 .sed 文件做到这一点。您需要像 Resource Hacker 这样的 PE 资源编辑器来编辑输出包的应用程序清单并进行必要的更改。以上是关于打包为 IExpress 可执行文件的批处理文件无法正常运行的主要内容,如果未能解决你的问题,请参考以下文章
Java程序导出成.jar文件生成.exe可执行文件及打包成可执行安装程序(可在无Java环境的计算机上运行)--以个人所得税计算器为例