【问题标题】:Batch script does not run in temporary folder after decompressing SFX WinRAR file解压自解压 WinRAR 文件后,批处理脚本不在临时文件夹中运行
【发布时间】:2017-01-03 14:42:38
【问题描述】:

我有一个单独设置 32 位和 64 位的程序。我的目标是创建一个可以运行适当设置的可执行文件。于是我创建了一个文件夹,把两个设置放在里面,然后写了如下脚本:

@echo off

if %PROCESSOR_ARCHITECTURE%==AMD64 goto :x64
if %PROCESSOR_ARCHITEW6432%==AMD64 goto :x64

:x86
    "%cd%"\setup.exe
    exit

:x64
    "%cd%"\setup-x64.exe
    exit

之后,我在 WinRAR 中用这个文件夹创建了 SFX 文件,指向 BAT 文件。但是当我运行它时,会弹出一个命令行窗口并立即关闭,什么也没有发生。我转到临时文件夹并双击 BAT 文件并开始设置。在原始文件夹中也会发生同样的情况。发生了什么,我该如何解决?谢谢!

【问题讨论】:

  • 尝试在@echo off 下方添加setlocal 然后pushd "%~dp0" 看看是否会有所不同。
  • "%~dp0setup.exe" 代替 "%cd%"\setup.exe"%~dp0setup-x64.exe" 代替 "%cd%"\setup-x64.exe?
  • @rojo 和 @JosefZ,您的解决方案都有效!我发现%~dp0 表示指向脚本位置。我更喜欢使用pushd "%~dp0" 选项,看起来更优雅。但是,我真的需要setlocal 吗?从我搜索的内容来看,我不明白它可能用于什么。
  • %~dp0 技巧应该可以解决问题,但是为了在将来调试类似问题,请删除或注释掉 @echo off 并将 pause 放在所有退出点之前:命令窗口应该保持打开状态,您将能够看到正在运行的命令(在这种情况下,显示 %cd% 并不是您认为的那样)。
  • @Alegom 在这种情况下你可能不需要需要 selocal,因为调用批处理文件的东西可能不会关心它改变了当前目录。但是,通常这可能是“好习惯”,这样调用批处理文件不会让您进入不同的目录(除非批处理文件的目的是更改目录)。

标签: batch-file winrar sfx temporary-directory


【解决方案1】:

%cd%指批处理文件的调用目录。

例如一个批处理文件在%USERPROFILE%\Desktop\Folder\bat.bat:

echo %cd%
pause

例如,您可以像这样从命令行启动它:

C:\>%USERPROFILE%\Desktop\Folder\bat.bat

它应该回显C:\,因为那是你调用它的地方。

从cmets解决问题的两种方法:

使用pushd "%~dp0"推送批处理文件的目录->将导致%cd%的变量值发生变化

不要使用"%cd%",而是使用"%~dp0"

这两种方法都使用批处理文件的第零个参数是它的路径这一事实。

如果可能的话,如果您从命令提示符本身调试文件,您可以阻止命令行窗口关闭。有了它,您应该已经看到了类似...\setup.exe not found 的错误。之后,不需要对批处理文件进行任何操作,因此它关闭了。

【讨论】:

  • 感谢您的完整解释!我将此标记为答案,但你们四个都做出了贡献,对此我表示感谢。
  • 我很感谢别人不厌其烦地解释。 +1 来自我。 :)
  • 很高兴听到它有帮助! @rojo 它也帮助我学习,所以我很乐意提供帮助:)
猜你喜欢
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多