-= DriveR =- писал(а):
Есть понятие "Рабочая папка"Оно есть и в компоненте WinExec и в любом ярлыке виндовом
Так вот рабочей папкой считается та папка, из которой стартует приложение.
Улавливаешь ход мыслей?
Абсолютно верно. Если не задействовать точку WorkingDir элемента WinExec, то ОС при запуске bat файла (а точнее говоря интерпретатора командной строки), автоматически установит для него ту же самую рабочую директорию что и у запускающей его программы (то есть твоей программы). Какова будет эта диретория - зависит от разных обстоятельств, она может и не соответствовать директории в которой находится твоя программа, но это в данном случае не важно. Важно что она не будет соответствовать директории в которой находится bat. Далее. Интерпретатор в команде copy попытается реконструировать полные пути к файлам, заменив files\x.mp3 на рабочая_директория\files\x.mp3. А так как рабочая директория запускающей программы не равна директории в которой находится bat, то интерпретатор по реконструированным путям ничего не найдет. Когда же ты запускаешь bat вручную из проводника, то проводник установит для запускаемого им (для обработки bat файла) интерпретатора рабочую директорию равную папке из которой ты запустил bat. В этом случае реконструированные пути окажутся верными и bat отработает корректно.
Что дает строка cd /d %~dp0 в bat файле?
Команда cd заставит интерпретатор сменить текущий каталог (это то же самое что и рабочая директория).
Ключ /d здесь для страховки, на случай если bat файл и запускающая его программа находятся на разных дисках.
Конструкция %~dp0 будет заменена интерпретатором на полный_путь_к_директории_расположения_bat_файла (вместе с завершающим слэшом).
В результате как бы ты не запустил bat файл (вручную либо через другую программу), он всегда отработает одинаково.
PS Как вариант, вместо строки cd /d %~dp0 в начале файла, можно добавлять модификатор %~dp0 в команду copy, например, copy %~dp0test\files\1.mp3 %~dp0test\files\2.mp3. Но по-моему это лишние телодвижения.
Также, как вариант, можно не менять bat файл, а вместо этого подать на точку WorkingDir элемента WinExec полный путь к папке расположения bat файла.