Пакетный скрипт не запускается во временной папке после распаковки файла SFX WinRAR

У меня есть программа с отдельной настройкой для 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

После этого я создал SFX-файл с этой папкой в ​​WinRAR, указав на BAT-файл. Но когда я запускаю его, появляется окно командной строки и мгновенно закрывается, и ничего не происходит. Я перехожу во временную папку и дважды щелкаю файл BAT, и начинается установка. То же самое происходит в исходной папке. Что происходит и как я могу это исправить? Спасибо!


person Alegom    schedule 03.01.2017    source источник
comment
Попробуйте добавить setlocal, а затем pushd "%~dp0" чуть ниже @echo off и посмотрите, будет ли это иметь значение.   -  person rojo    schedule 03.01.2017
comment
"%~dp0setup.exe" вместо "%cd%"\setup.exe и "%~dp0setup-x64.exe" вместо "%cd%"\setup-x64.exe?   -  person JosefZ    schedule 03.01.2017
comment
@rojo и @JosefZ, оба ваших решения работают! Я обнаружил, что %~dp0 означает направление к местоположению скрипта. Я предпочитаю использовать вариант pushd "%~dp0", он кажется более элегантным. Однако действительно ли мне нужно setlocal? Я не понял, для чего это может быть использовано, из того, что я искал.   -  person Alegom    schedule 03.01.2017
comment
Трюк с %~dp0 должен решить проблему, но для отладки подобных проблем в будущем удалите или закомментируйте @echo off и поставьте pause перед всеми точками выхода: окно команд должно оставаться открытым, вы сможете увидеть запущенные команды ( в этом случае показ %cd% был не тем, что вы думали).   -  person TripeHound    schedule 03.01.2017
comment
@Alegom Вам, вероятно, не нужно selocal в этом случае, так как то, что вызвало командный файл, вероятно не будет заботиться о том, чтобы он изменил текущий каталог. Тем не менее, в целом это, вероятно, хорошая практика, так как вызов пакетного файла не оставляет вас в другом каталоге (если только целью пакетного файла не является изменение каталога).   -  person TripeHound    schedule 03.01.2017


Ответы (1)


%cd% относится к каталогу вызова пакетного файла.

Например, пакетный файл находится в %USERPROFILE%\Desktop\Folder\bat.bat:

echo %cd%
pause

и вы запускаете его, например, из командной строки следующим образом:

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

он должен отобразить C:\, так как именно оттуда вы его вызвали.

Два пути из комментариев для решения проблемы:

Нажмите каталог пакетного файла с помощью pushd "%~dp0" ->, что приведет к изменению значения переменной %cd%

or

используйте не "%cd%", а "%~dp0"

Оба способа используют тот факт, что нулевым аргументом пакетного файла является его путь.

Вы можете предотвратить закрытие окна командной строки, если вы отлаживаете файл из самой командной строки, если это возможно. При этом вы должны были увидеть ошибку, в которой указано что-то вроде ...\setup.exe not found. После этого ничего не нужно было делать из батника, поэтому он закрылся.

person geisterfurz007    schedule 03.01.2017
comment
Спасибо за полное объяснение! Я отмечаю это как ответ, но все четверо внесли свой вклад, за что я благодарен. - person Alegom; 03.01.2017
comment
Я благодарен, что кто-то еще взял на себя труд объяснить. +1 от меня. :) - person rojo; 03.01.2017
comment
Рад слышать, что это было полезно! @rojo это тоже помогает мне учиться, поэтому я рад помочь :) - person geisterfurz007; 03.01.2017