CMD: конвертер Bat в Exe - проблема с временным каталогом

я использую 'Bat to Exe Converter' для преобразования моих пакетных файлов в exe формат.

Теперь я сталкиваюсь с некоторыми проблемами. Всякий раз, когда я что-то конвертирую и устанавливаю «Рабочий каталог» в «Текущий каталог» и запускаю свой exe в режиме echo on, это то, что я получаю, чтобы проверить, есть ли определенный файл в каталоге моего exe:

the actual command: if not exist "%~dp0\file.txt" goto :nofile

output: if not exist "C:\Users\MyUser\AppData\Local\Temp\4CBC\\file.txt" goto :nofile

Кто-нибудь может мне с этим помочь? Я не хочу, чтобы он находился во временном каталоге, я хочу, чтобы он был в каталоге моего исполняемого файла.

Спасибо.


person Deniz Zoeteman    schedule 02.01.2010    source источник


Ответы (9)


Если автор не изменил Bat на Exe, я думаю, у вас есть два варианта:

  1. Удалите необходимость доступа к %~dp0

    Возможно, вы можете объединить file.txt с опцией включения Bat to Exe в файл EXE. Если это так, "file.txt" будет автоматически распаковываться в текущий каталог при запуске скомпилированного исполняемого файла, и вы сможете получить к нему доступ с помощью %CD%\file.txt.

  2. Получите %~dp0 извне и передайте его exe в качестве параметра командной строки.

    Это можно сделать с помощью простого начального файла bat, который находится в том же каталоге, что и ваш скомпилированный основной пакетный файл. Этот скрипт должен содержать строку

    YourCompiled.Exe %~dp0% %%* 
    

    Затем ваш скомпилированный исполняемый файл получает свой каталог из %1. Так что все в один экзешник не запихнешь, но основную его часть, возможно, тебе и хватит.

person Doc Brown    schedule 02.01.2010
comment
проблема с 1-м: «file.txt» создается пакетным файлом, когда пользователь вводит параметр. Файл должен идти с пакетным файлом все время. И, когда он объединен, и вы выходите из пакета только с помощью кнопки «выход»; он фактически не объединяет его снова; он просто оставляет его там. - person Deniz Zoeteman; 03.01.2010
comment
Ну, тогда второй вариант может быть для вас вариантом. Или, если вы считаете, что вам действительно нужно все в одном EXE-файле, не рассматривали ли вы возможность использования настоящего скомпилированного языка? - person Doc Brown; 04.01.2010
comment
второй кажется полезным. можно ли получить другую переменную %2 или что-то в этом роде? %1 уже назначено делать с ним что-то еще. - person Deniz Zoeteman; 04.01.2010
comment
Что ж, вы можете попробовать либо YourCompiled.Exe %%* %~dp0%, либо YourCompiled.Exe %1 %~dp0% - person Doc Brown; 04.01.2010

Ну, очевидно, ваш конвертер пакетов в exe просто упаковывает пакетный файл и извлекает его во временный каталог перед выполнением. Очень упрощенно, трудно ошибиться (по сравнению с фактическим пониманием пакетного файла), но это приводит к ошибкам, подобным той, которую вы описываете.

Лучше всего, вероятно, использовать другой пакетный конвертер в exe; некоторые из них на самом деле немного сложнее.

person Joey    schedule 02.01.2010

Как правило, это не очень хорошая идея. во-первых, он подвержен ошибкам и нестабильности конвертера на разных функциях cmd. во-вторых, решительный хакер все равно может расшифровать, что вы делаете с пакетом. Мое предложение, если вы так боитесь, что люди будут изучать вашу партию,

1) let only the people who are authorized to use your batch to use it
2) give them the correct permissions.

ИЛИ вообще не используйте пакетную обработку

1) create a central interface such as a web interface, where all tasks to be done goes through that interface, like using an ATM machine where only buttons are allowed and all the available user options can be done by pushing buttons...etc..
2) authenticate your users through a central authentication system, eg Active Directory, or LDAP or a database.
person ghostdog74    schedule 02.01.2010
comment
дело не в том, что мне не нравятся парни, изучающие мой код: просто вы можете лучше назначать вещи, если это exe. - person Deniz Zoeteman; 03.01.2010

Этой теме уже 2,5 года, но на нее есть ответ, поэтому я пишу для всех, кто случайно найдет это в поиске.


B2EC, написанный Фатихом Кодаком, имеет возможность "Отправить текущий каталог".

Когда это используется, вы можете сослаться на %1 в своем пакетном файле, чтобы получить путь к исполняемому EXE-файлу (вместо пути извлеченного BAT, который действительно запускается).

введите здесь описание изображения

При наведении курсора на этот параметр в пользовательском интерфейсе отображается «Отправить текущий рабочий каталог в качестве последнего параметра». «Последний параметр» в моем использовании всегда был %1, но вы можете проверить свой код, чтобы быть уверенным.

введите здесь описание изображения

person RLH    schedule 14.10.2012

Последняя версия, 2.1.4 на момент написания, Bat to Exe от Fatih Kodak создает переменную среды во время выполнения, которую можно заменить вместо % ~ dp0 для ссылки на путь Exe. Поэтому вы можете просто заменить %-dp0 на %b2eprogrampathname% в исходном пакетном файле.

person Robert Wigley    schedule 21.11.2014

Вы можете использовать внешние папки с пакетным конвертером f2ko в exe. Наличие отдельной папки для подпрограмм может сделать папку проекта более аккуратной. Чтобы вызвать mysubroutine, расположенную в mysubroutinesfolder\mysubroutine,

...
pushd mysubroutinesfolder
call mysubroutine
popd
...

Вызов может быть сделан одним вкладышем:

call xqt mysubroutine

где xqt.cmd — это программа, которая делает вызов за вас:

pushd mysubroutinesfolder
call %*
popd
exit /b

(%* означает «все аргументы»). Таким образом, ваши пакетные программы запускаются как пакетные, и НЕИЗМЕНЕННЫЕ они будут скомпилированы с помощью конвертера bat в exe, создавая полностью независимый от папки исполняемый файл. Выберите «временный каталог» и включите все подпрограммы/исполняемые файлы в папку mysubroutines, «выбрав их все» с помощью курсора, как обычно, затем нажмите «копировать». Не забудьте также включить программу xqt.cmd; поместите его «вне» вашей папки mysubroutines. Убедитесь, что он доступен вашей основной программе. Не забудьте выбрать x64, если вы работаете на машине с архитектурой x64, иначе исполняемый файл не найдет файлы SYSTEM32. Вы можете найти пакетный конвертер f2k0 в exe по адресу:

http://www.f2ko.de/programs.php?pid=b2e

person pollaris    schedule 25.03.2015

Попробуйте эту среду разработки для пакетных сценариев, компилятор пакетов . В нем есть все необходимое для разработки пакетной программы. И компиляции в стабильный автономный исполняемый файл (Exe).

Friendly user interface.
Debugger, Check your code for syntax errors.
Powerful, versatile compiler.
Allows mouse input in batch files.
Use Windows Common Dialog Boxes.(BrowseFiles,BrowseFolders)
Draw graphics in batch files.
Reverse engineering proof encryption of source code.
Include Company name, Copyright info and Version info.
Make invisible(silent) executables.
Executables with administrator privileges.
Run & debug your script while editing.
Embed resources with executable.(music,images,files)
Advance Commands (BrowseFiles,LaunchSilent,MouseCMD)
Stand-alone executables.No dependencies needed.
Executables are woking on almost all windows operating systems.(98 to 10)

Быстрая загрузка: http://bc.gotek.info/files/BatchCompiler159.zip

Ваше здоровье!

person isuru arunoda    schedule 02.08.2015

%cd% даст вам текущий каталог:

if not exist "%CD%\file.txt" goto :nofile
person BlueRaja - Danny Pflughoeft    schedule 02.01.2010
comment
cd снова показывает «рабочий каталог», а не каталог самого файла. - person Deniz Zoeteman; 02.01.2010

Используйте %CD% вместо %~dp0.

ИЗМЕНИТЬ:

B2EC не является настоящим конвертером. Местом создания оборудованного файла .cmd было выбрано %TEMP%, и это хороший выбор. В приложении просто отсутствует 3-й вариант рабочего каталога скрипта - каталог с файлом .exe. Я советую вам написать автору о добавлении этого.

Различные пути для .exe и созданного .cmd приводят к потере информации, т.е. мы не можем знать каталог .exe и текущий каталог одновременно, не предоставляя скрипту дополнительную информацию (например, используя переменную окружения или передавая ее в качестве первого/последнего аргумента). к сценарию). Этому сценарию нужно будет справиться с этим, и мы закончим писать сценарии cmd, адаптированные для этого конвертера, что плохо.

%~dp0 - каталог скриптов (%TEMP%/.../) - практически бесполезен

%cd% - рабочий каталог (как указано в конвертере) - в настоящее время есть только 2 варианта: текущий каталог (рабочий каталог .exe) и временный каталог (фактически равный %~dp0, но без обратной косой черты)

Я думаю, что это можно решить, исправив экземпляр cmd.exe в памяти, чтобы изменить путь к сценарию, но это обязанность разработчика B2EC.

Примечание: Обычные исполняемые файлы можно легко запустить с указанным 0-м аргументом, предоставив соответствующие функции lpApplicationName и lpCommandLine до CreateProcess. Командные файлы выполняются через cmd.exe, поэтому 0-й аргумент не может быть установлен таким образом.

person przemoc    schedule 02.01.2010
comment
cd снова показывает «рабочий каталог», а не каталог самого файла. - person Deniz Zoeteman; 02.01.2010
comment
На самом деле он показывает текущий каталог, если вы выбрали рабочий каталог в качестве текущего каталога (это опция по умолчанию). Этот конвертер не является настоящим конвертером, потому что он просто создает файл .bat/.cmd в каталоге %TEMP%, и поэтому %~X0 не работает так, как вы хотите. - person przemoc; 02.01.2010
comment
я попробовал это, и кажется, что он все еще дает рабочий каталог, поэтому, например, если файл exe-файла находится в MyUser/Desktop/test.exe, и я запускаю его в командной строке из C:\Users\MyUser, рабочий каталог по-прежнему «MyUser». Я хочу, чтобы это было местоположение файла, поэтому «MyUser/Desktop»! - person Deniz Zoeteman; 02.01.2010