Показать полную графическую версию : [решено] При конверте .bat в .exe не работают переменные
DesmondTruman
19-02-2012, 16:09
Здравствуйте, написал батник, при конверте которого в .exe через программу "Quick Batch file compiler" перестают работать некоторые %переменные%.
Сам батник работает, но при конверте которого в .exe перестаёт работать. Чтобы понять в чём проблема, оставил батнике лишь строчку attrib +h %0 и переконвертировал в .exe и запустив, понял, что не работают переменныя %0 и скорей всего остальные его расширения.
@echo off
attrib +h %0
if not exist "%systemroot%\%~nx0" echo F | xcopy %~nx0 "%systemroot%\%~nx0" /h /y
if %0=="%systemroot%\%~nx0" goto end
echo del /f /q /a h %~nx0 > un%~n0.bat
attrib +h un%~n0.bat
echo del /f /q /a h un%~n0.bat >> un%~n0.bat
start /min cmd /C un%~n0.bat
:end
exit
Тот же код, только с комментариями:
@echo off
rem Делаем себя скрытым
attrib +h %0
rem Проверяем есть ли наша копия в %systemroot%, если нету копируем себя туда
if not exist "%systemroot%\%~nx0" echo F | xcopy %~nx0 "%systemroot%\%~nx0" /h /y
rem Проверяем свою директорию с %systemroot%, если мы находимся в %systemroot%, то заканчиваем сценарий. Это чтобы мы не удалили себя же когда будет находиться в %systemroot%.
if %0=="%systemroot%\%~nx0" goto end
rem Создаём батник, который удалит первый батник, потом себя.
echo del /f /q /a h %~nx0 > un%~n0.bat
echo del /f /q /a h un%~n0.bat >> un%~n0.bat
rem Делаем созданный батник скрытым
attrib +h un%~n0.bat
rem Запускаем второй батник и заканчиваем сценарие
start /min cmd /C un%~n0.bat
:end
exit
Эти переменные я написал чтобы не было привязки к пути и имени файла.
Как преодолеть эту проблему, что можно сделать?
Ps: Тут вопросик всплыл, что за переменная %* ? Видел в чужих сценариях.
Anonymоus
19-02-2012, 16:38
Попробуйте Bat to Exe Converter (http://www.f2ko.de/programs.php?lang=en&pid=b2e), при конвертации им ваш батник отрабатывает корректно.
%* - это все аргументы, переданные скрипту, без разбора на %1 - %9.
DesmondTruman, я думаю, дело в том, что на самом деле компилятор создает, по сути, нечто вроде SFX-архива - т.е. программу EXE, которая при запуске создаёт батник в папке Temp. Поэтому %0 будет относиться к этому файлу в папке Temp.
Не сочтите за занудство... а не вирус ли пишете? Какой-то своеобразный функционал...
DesmondTruman
19-02-2012, 17:05
Anonymоus Спасибо, вечером проверю и отпишусь.
Котяра Интересная мысль, проверю вечером изменив пару строчек.
Не сочтите за занудство... а не вирус ли пишете? Какой-то своеобразный функционал...
Да нет, что вы, какой вирус из батника)) Вы бы меня поняли, если бы имели дело с пользователями, кто не в состоянии нажать только два (а не 3-4-5) клика по программе.
DesmondTruman
19-02-2012, 20:05
Котяра Всё совершенно правильно, так как вы и сказали. Проверил с echo %0 > log.txt .
И еще инфа c офиц. сайта программы : After compilation batch script become a binary file, so you not longer use any text from it. For example, you can not use "type %0" command to show batch source.
All batch scripts executed by a single system process "cmd.exe", so they can exchange environment variables. Every EXE file executed in separate system process and this exchange not allowed. You can only use return code.
И не пойму, почему же %0 действует относительно батника с temp, а например > log.txt действует относительно exeшника?
Anonymоus Скачал, проверил, увы так же как и "Quick Batch file compiler" создаёт bat в %temp%. Не понимаю как он у вас заработал...
Под словами "отрабатывает корректно" вы что имели в виду? То что вы запуcтили .exe файл и он стал невидимым и скопировал себя в %systemroot% ?
Есть какие то еще варианты, подобные %0, чтобы считывать свою дерикторию\имя\расширение ?
Anonymоus
19-02-2012, 21:43
DesmondTruman, прошу прощения, не до конца протестировал.
Выбираете при компиляции на первой вкладке, там, где Working directory - temporary directory (он все равно во временной создаваться будет, это похоже болезнь всех подобных "компиляторов"), отмечаете чекбокс "submit current directory" - в %1 будет путь к тому месту, откуда запускается откомпилированый экзешник. И правите код скрипта, как в этом примере:
@echo off
rem Делаем себя скрытым
attrib +h "%~dp1%~n0.exe"
rem Проверяем есть ли наша копия в %systemroot%, если нету копируем себя туда
if not exist "%systemroot%\%~n0.exe" echo F | xcopy "%~dp1%~n0.exe" "%systemroot%\%~n0.exe" /h /y
rem Проверяем свою директорию с %systemroot%, если мы находимся в %systemroot%, то заканчиваем сценарий. Это чтобы мы не удалили себя же когда будет находиться в %systemroot%.
if "%~dp1%~n0.exe"=="%systemroot%\%~n0.exe" goto end
rem Создаём батник, который удалит первый батник, потом себя.
echo del /f /q /a h "%~dp1%~n0.exe" > "%~dp1un%~n0.exe"
echo del /f /q /a h "%~dp1un%~n0.exe" >> "%~dp1un%~n0.exe"
rem Делаем созданный батник скрытым
attrib +h "%~dp1un%~n0.exe"
rem Запускаем второй батник и заканчиваем сценарие
start /min cmd /C "%~dp1un%~n0.exe"
:end
exit
Или, что проще - в качестве working directory оставляете current directory (значение по умолчанию), в таком случае на скомпилированный экзешник будет указывать вот такая запись:
%cd%\%~n0.exe
DesmondTruman
20-02-2012, 01:23
Anonymоus Спасибо вам огромное, работает.
Только я одного не понял, как вы узнали что в аргументе %1 передаётся путь ехешника?
Anonymоus
20-02-2012, 01:31
DesmondTruman, иногда бывает полезно читать справку к используемым программам, в случае с "Bat to Exe Converter", если отметить чекбокс "Submit current directory", то последним параметром как раз и будет передаваться реальный путь к экзешнику, а не распакованному батнику в %TEMP%. Так как других параметров при запуске у нас нету, то этот путь оказывается в %1.
DesmondTruman
20-02-2012, 12:38
Anonymоus Я бы прочитал, если бы он был в программе, но его нет (по крайней мере в той, который вы дали), и на их сайте не увидел, поэтому и спросил.
Anonymоus
20-02-2012, 13:09
fdko.de ⇒ Bat to Exe Converter ⇒ Download ⇒ Bat_To_Exe_Converter.zip ⇒ help.chm ⇒ English ⇒ Options ⇒ • Submit current directory Submit the current directory as the last parameter
Вот тут об этом было написано, файл помощи лежит прямо в корне скачиваемого с сайта архива с программой.
fdko.de ⇒ Bat to Exe Converter ⇒ Download ⇒ Bat_To_Exe_Converter.zip ⇒ help.chm ⇒ English ⇒ Options »
Эту часть можно указывать (при условии, что приложение установлено в умолчальную папку), например, и так:
hh.exe "mk:@MSITStore:C:\Program%20Files\BatToExeConverter\Help%20[English].chm::/index.html#func"
sLiDeR-X
26-04-2012, 07:44
Я сам ищу такую программу, которая бы переделывала cmd/bat в exe, а не делала sfx-архив.
Для себя сам сделал очень просто: сделал 7zsfx, в его конфиге RunProgram="_Go.cmd %%S", а в самом батнике Set Sourse=%~1
А мне хочется, чтоб мой код никто не увидел. Выдернуть из папки %temp% любой сможет :(
Р.S.
За что Quick Batch file compiler берут деньги? %)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.