Bat файл не удается найти файл
формирую батник, стартую его с помощью КомандаСистемы, батник вызывает в себе другой командой start, после чего первый успешно завершается, а второй работает, при этом 1С дальше выполняет код. Однако по завершении выполнения задач второй батник не закрывается автоматически. На команду "exit" выдает сабж. каким способом его можно завершить? если нельзя, то как запустить батник, не дожидаясь завершения его работы?
TASKKILL /F /IM cmd.exe /T - конечно, варварский способ, но есть что-нибудь получше? а то неизвестно, вдруг в этот момент еще будут такие же процессы, которые завершать нельзя?
echo Ожидание монопольного доступа к базе. Подождите.
:begin
PING -n 5 -w 1000 127.0.0.1 > nul
ren 1cv7.md 1cv7_original.md > nul
if exist 1cv7.md goto begin else goto end
:end
echo Подождите, идет сборка конфигурации 1С.
gcomp -c
echo Конфигурация обработана. Теперь нажмите Enter для выхода и снова запустите 1С.
pause
если не тасккилл - то окно просто остается висеть с приглашением ввода команды, exit в батнике игнорируется.
если же напрямую его вызывать из 1С или командой call, то exit работает. но 1С ожидает конца его выполнения, а это не надо.
Вижу текст одного батника . надеюсь это второй . ну да ладно, зачем там pause - читай ожидание нажатия клавиши "any key" ?
второй батник элементарен (вернее первый):
(15) версию, использующую перехватчик (как мне тут советуют) я сделаю чуть позже, там это уже не понадобится. так что, пока на костылях поживем. думал, ответ на поверхности.
Чтобы окно bat-файла закрывалось, нужно вызывать его через ярлык, в котором будет указано "Закрывать окно после завершения".
P.S. а неплохо бы ещё и автоматический запуск 1С после сборки добавить.
Кроме того, подключение к 1С можно проверить по наличию 1cv7.lck файла в директории и не пытаться переименовать md.
(21) это я знаю. если запускать батник как угодно, но не из 1С, очистка экрана даже его закрывает. а через 1С этот фокус не срабатывает. насчет запуска - думал запускать 1Ску после обработки, но передумал. мало ли как она запускается у юзера. а как узнать, каким ехешником запущена база? путь есть, каталог базы есть, юзер есть, монопольный режим есть, нет ехешника и пароля ХДД
(21) насчет лок-файла ты не прав - если открыт конфигуратор, то лок-файл есть, а мне пофиг, открыт ли конфигуратор или нет. главное - доступ к мд.
Но батник выдаёт ошибку, пишет, что системе не удалось найти указанный путь. При этом та же команда в CMD работает и путь находится. В чём подвох?
Простой 2 комментария
А какой именно путь он не говорит?
Вероятнее всего у вас вместо пути кракозябры из-за разной кодировки.
Поправьте кодировку в батнике или вместо C:\Users\Альтрон\AppData\Local\mRemoteNG напишите
%userprofile%\AppData\Local\mRemoteNG чтобы избежать кириллицы в пути.
АртемЪ, попробовал сделать как Вы сказали, теперь пишет синтаксическая ошибка в имени файла, папки или метке тома.
У вас в пути русские буквы.
По умолчанию кодировка в cmd cp866, а вы батник скорее всего сохранили в кодировке cp1251 (или того хуже в UTF8), поэтому и русские буквы у вас стали кракозябрами и такой путь найтись не может.
Либо добавьте перед вашей командой в батнике команду
chcp 1251
Либо сохраните батник в кодировке cp866 любы доступным средством, только убедитесь, что русские буквы правильно конвертировались.
попробовал сделать вместо русских букв вставить
%userprofile%
теперь пишет синтаксическая ошибка в имени файла, папки или метке тома.
так же попробовал вставить перед командой chcp 1251 так как вы сказали, ситуация не поменялась, только всё превратилось в кракозябры
Vladislav123321123, Тогда начните с того, что определите в какой кодировке у вас сохранен батник.
chcp 1251 сработает только в случае, если батник сохранен в кодировке 1251.
Так же напишите версию ОС, которую вы используете.
Все превратиться в кракозябры не могло, т.к. у вас в пути только "Альтрон" написано по русски, все английские буквы не зависят от кодировок (в 866, 1251, UTF8 - английский алфавит кодируется одинаково).
И давайте сюда уже и сам батник и его вывод.
Vladislav123321123, определить и поменять кодировку можно например в Notepad++ или во встроенном редакторе Far manager. Других средств то же полно.
userpofile поменял обратно на Альтрон, добавил перед командой chcp 1251
теперь всё работает спасибо)
В лог файле продолжает выдавать кракозябры, но это неважно, так как работает теперь. Благодарю!
Vladislav123321123, лог файл записывается в той же кодировке, что указана в команде chcp.
Текстовые файлы они не такие простые, как кажутся на первый взгляд :-)
При запуске ее в командной строке, все запускается без ошибок.
А вот если ее запихнуть в BAT-файл и запустить файл, то возникает ошибка:
Ну это же очевидно - разделитель пробел. Чтобы пробел считался частью переменной текст нужно брать в кавычки.
А еще забыл сказать что CD не может менять диск - работает только в пределах одного диска - на котором запущен интерпритатор.
тут еще смайлик положен :рукалицо:
Не выходит. Вот исправил. Запускаю из BAT-файла. Все равно ошибка. Привожу листинг:
Александр: Ничего не изменилось. Вот что вышло:
zamboga: понятное дело что его там нет. Потому что CD не сработал. А если бы сработал, то файл был бы найден.
zamboga: Вот, прописал полный путь. Теперь вообще не понятная ошибка:
вот от пробелов в пути всетаки лучше избавиться, от них всегда только проблемы. Вообще это виноват тот кто назвал папку "Program Files" - сколько програмисты мучались с ним никому не известно.
zamboga: Исключено. Если эту команду просто вставить в командную строку, как я вначале поста писал, то все работает без ошибок. Так что не в пробелах проблема.
Александр: Смысл? На другом сервере будет та же проблема. И вообще, это не решение проблемы. Почему без BAT-файла все работает?
Святослав: кстати, прав ещё может не хватать на program files. Ручками вы запускаете командную строку от администратора, а батник по дефолту - без.
сам бы давно поигрался кавычками и переменными. может даже другие кавычки попробовать
А еще лучше перенес бы из "Program Files" это дело. так как все ошибки были связанны с пробелом.
'C:\Program' вместо 'C:\Program Files\Element2\index.js'
И когда будешь переносить старайся чтобы это было на одном диске - винда не любит разные диски.
А еще забыл сказать что CD не может менять диск - работает только в пределах одного диска - на котором запущен интерпритатор. Как то сталкивался с этим.
кинь батник на диск C и он заработает.
Святослав: Александр: "CD не может менять диск - работает только в пределах одного диска" -- кстати, да, cd диск не меняет, что дико неудобно.
вот от пробелов в пути всетаки лучше избавиться, от них всегда только проблемы. Вообще это виноват тот кто назвал папку "Program Files" - сколько програмисты мучались с ним никому не известно.
Вот тебе листинг reg-файла. Запускай и будет тебе счастье.
Windows Registry Editor Version 5.00
;Восстановление ассоциирования файлов [.BAT] - Windows 7
[HKEY_CLASSES_ROOT\batfile]
@="Windows Batch File"
"EditFlags"=hex:30,04,00,00
"FriendlyTypeName"=hex(2):40,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,\
00,6f,00,6f,00,74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,\
32,00,5c,00,61,00,63,00,70,00,70,00,61,00,67,00,65,00,2e,00,64,00,6c,00,6c,\
00,2c,00,2d,00,36,00,30,00,30,00,32,00,00,00
[HKEY_CLASSES_ROOT\batfile\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,69,00,6d,00,\
61,00,67,00,65,00,72,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,36,\
00,38,00,00,00
[HKEY_CLASSES_ROOT\batfile\shell\edit\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
00
[HKEY_CLASSES_ROOT\batfile\shell\print\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,2f,00,70,00,20,\
00,25,00,31,00,00,00
[HKEY_CLASSES_ROOT\batfile\shell\runas\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6d,00,\
64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,43,00,20,00,22,00,25,00,31,00,22,\
00,20,00,25,00,2a,00,00,00
[HKEY_CLASSES_ROOT\batfile\shell\runasuser]
@="@shell32.dll,-50944"
"Extended"=""
"SuppressionPolicyEx"=""
[HKEY_CLASSES_ROOT\batfile\ShellEx\PropertySheetHandlers\ShimLayer Property Page]
@=""
Командная строка, батники\сценарии (bat, cmd)
( часть 1 ) ( часть 2 ) ( часть 3 )
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно. Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
Примечание: Большие куски кода заключайте в тэг [more]
а так работает:
for /f "skip=2 tokens=2 delims=:" %%i in ('fsutil volume diskfree %cd%') do (fsutil file createnew filename %%i)
правда я почитал, но так и не понял как используются skip=2 tokens=2
мне вот нужно чтобы обрабатывалась только первая подстрока а не третья.
тыкал тыкал, но закономерность не выявил) хочется понять.
for /f "Tokens=1" %%i in ('fsutil volume diskfree %cd%') do fsutil file createnew filename "%%i"
C:\>"C:\qf qf.bat" "C:\Program Files"
Результат диалоговое окно:
как раз и написал, что я читал for /?
но так и не понял какова закономерность этих ключей и как они работают,
к примеру повторюсь, нужен (был) результат первой подстроки, насколько я понимаю это
skip=0 tokens=1 но это видимо неверно.
я вообще дубом в этом и ничего не програмирую) мне просто нужно для трукрипта несколько скриптов, которые я потом выложу для удобного монтирования, автозапуска при /a и как дополнение - автозаполнения оставшегося пространства для защиты от записи вируов- На fat32 и exFat такое работает, а на ntfs не канает, после переподключения флешки освобождается(?) 4мб.
q.bat помещенный в C:\Program Files\PowerQuest\PartitionMagic 8.0\
Выполнение: start "" "C:\Program Files\PowerQuest\PartitionMagic 8.0\q.bat" "a b c d"
Выполнение: start "" "C:\Progra~1\PowerQ~1\Partit~1.0\q.bat" "a b c d"
Выполнение: start "" "C:\Program Files\PowerQuest\PartitionMagic 8.0\q.bat" "a"
Выполнение: start "" ""C:\Program Files\PowerQuest\PartitionMagic 8.0\q.bat" "a""
Выполнение: start "" ""C:\Program Files\PowerQuest\PartitionMagic 8.0\q.bat" "a""
Выполнение: start "" "C:\Progra~1\PowerQ~1\Partit~1.0\q.bat" "a"
Выполнение: start "" "C:\Program Files\PowerQuest\PartitionMagic 8.0\q.bat" a
Выполнение: start "" C:\Progra~1\PowerQ~1\Partit~1.0\q.bat "a"
Выполнение: start "" "C:\Program Files\PowerQuest\PartitionMagic 8.0\PMagicNT.exe" "a b c d"
Программа запустилась и поругалась на неверные параметры командной строки.
Т.е. на ввод, например команды for /f %i in ('Dir /b c:\') do @echo %i пишет что-то типа:
Не нафига, т.е. не зачем, а просто констатация факта: я писал, что не запускает он (start) батники (в качестве передаваемой программы, а не cmd.exe вовсе) с полными путями и с параметрами (в которых пробелы и соответственно они заключаются в кавычки).
Надоело спорить. Говорим на одном языке, а друг-друга не понимаем.
А вот если один процесс запущенный из батника работает и выдаёт еррор 0 а другой не запущен - выдаёт еррор1. мне нужно сравнить эти результаты и при их разности выполнить нужную команду. как это можно сделать?
для наглядности мой корявый нерабочий код:
for %%a in (tasklist /fi "imagename eq file1.exe" | find /i "file1.exe") set %%a
for %%b in (tasklist /fi "imagename eq file2.exe" | find /i "file2.exe") set %%b
if not %%a==%%b (goto 1) else (goto 2)
Читайте также: