• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

Открытие найденого файла

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#1
Доброго времени суток!
У меня такой вопрос - как можно реализовать следующее: батник ищет определенный файл в системе(расположение может быть где угодно),скажем unattend.xml и открывает его, если находит.
 

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#2
Немного по другому спрошу- у меня есть последовательность команд типа :
CMD/BATCH:
dir с:\unattend.xml /s /b> "%~dp0dir.txt"
dir c:\services.xml /s /b> "%~dp0dir.txt"
.....
И мне нужно,чтобы результат записывался в одном файле- dir.txt и при этом не затирал предыдущие логи.

Потом другой батник построчно считывает пути найденных файлов и открывает их.

// Dragokas. Используйте теги оформления кода. Подробнее в теме: http://safezone.cc/threads/besplatn...ii-paketnyx-i-komandnyx-fajlov-cmd-bat.22344/
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#3
чтобы результат записывался в одном файле- dir.txt и при этом не затирал предыдущие логи.
Дозапись это знак >>

другой батник построчно считывает пути найденных файлов и открывает их.
CMD/BATCH:
@echo off
SetLocal EnableExtensions
for /F "UsebackQ delims=" %%a in ("%~dp0dir.txt") do notepad "%%~a"
P.S. Одной командой должно искать в 2 раза быстрее:

CMD/BATCH:
dir с:\unattend.xml c:\services.xml /s /b> "%~dp0dir.txt"
 

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#4
А как сделать, чтобы батник начинал открывать файлы только если не пуст сам файл, в котором хранятся записи. Я попробовал написать так, используя ваши предыдущие подсказки:
Код:
dir с:\unattend.xml c:\services.xml c:\scheduledTasks.xml c:\printers.xml c:\drives.xml c:\datasources.xml /s /b> "%~dp0dir.txt"
SetLocal EnableExtensions
for /F "UsebackQ delims=" %%a in ("%~dp0dir.txt") do if "%%~za"!="0" iexplorer "%%~a"
но видимо я не правильно написал логическое не равно (!=) не смог найти в что-то.
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#5
Справка:
Код:
if /?
Код:
@echo off
SetLocal EnableExtensions
cd /d "%~dp0"
dir с:\unattend.xml c:\services.xml c:\scheduledTasks.xml c:\printers.xml c:\drives.xml c:\datasources.xml /s /b> "dir.txt"
for /F "UsebackQ delims=" %%a in ("dir.txt") do if "%%~za" neq "0" notepad "dir.txt"
 

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#6
Странно пишет: системе не удается найти указанный путь, хотя все эти файлы лежат на диске С.
Например с:\Windows\Panther\untattend.xml
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#7
А Вы русские буквы "c" на латинские поменяйте :)
и ключ /a допишите к команде dir, чтобы скрытые атрибуты не пропускала.
 

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#8
Подскажите где ошибка? Батник должен считывать пути файлов с текстового документа и открывать их в Internet Epxlorer, если в этом файле записей нет, то на экране появляется сообщение: Ничего не найдено.
CMD/BATCH:
:m78
SetLocal EnableExtensions
cd /d "%~dp0"
dir c:\unattend.xml c:\services.xml c:\scheduledTasks.xml c:\printers.xml c:\drives.xml c:\datasources.xml /s /b /a> "dir.txt"
for /F "UsebackQ delims=" %%a in ("dir.txt") do if "%%~za" neq "0" (goto q1) else goto q2
:q1
iexplorer "%%~a"
goto m12
:q2
echo Файл данных не найден
goto m12

:m12
................
У меня батник просто вылетает.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#9
Не вылетает - просто завершается. Если поставить в конце pause, это будет видно.
А если и будет вылетать, можно запустить CMD.exe, а из него батник. Там будет видно на чем "вылетело".

В вашем случае 2 ошибки:
1) iexplorer - такого файла нет. Есть iexplore (без r)
Но даже таким образом он не запустится, т.к. пути Program Files\Internet Explorer нет в переменной Path (которая используется для поиска путей для запуска исполняемых файлов без указания полных путей).
Запуск через Win+R здесь не в счет. Так как там iexplore срабатывает, потому что использует другой механизм запуска - алиасы.
Поэтому нужно указывать полный путь.
2) %%~a может раскрываться только под циклом (грубо говоря: в одной логической строке с ним).
Передать значение можно или через обычную переменную, или через параметр командой call.
CMD/BATCH:
@echo off
SetLocal EnableExtensions

:m78
cd /d "%~dp0"
dir c:\unattend.xml c:\services.xml c:\scheduledTasks.xml c:\printers.xml c:\drives.xml c:\datasources.xml /s /b /a> "dir.txt"
for /F "UsebackQ delims=" %%a in ("dir.txt") do if "%%~za" neq "0" (call :q1 "%%~a") else call :q2
goto :eof

:q1
"%ProgramFiles%\Internet Explorer\iexplore.exe" "%~1"
exit /B

:q2
echo Файл данных не найден
Exit /B
 

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#10
Не подскажите в чем дело, сегодня запускал батник и наблюдал такую ситуацию - если батник запускать из-под командной строки, то тогда все работает, если же запустить сам батник напрямую, то программа просто вылетает, pause не помогает. Относится к посту выше.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#11
1. Батник запускаете случайно не через ПКМ -> "От имени администратора" ?
2. Напишите, как обозвали файл батника.
3. Давайте еще попробуем так:
а) скачайте Console Window Interceptor (внизу вложение).
Распакуйте, запустите, выставьте "Частота поиска окон" в 1 мс.,
нажмите "Искать консольные окна".
б) отредактируйте батник, удалив строку @echo off
Запустите батник, чтобы воспроизвести проблему "падения".
На этот раз окно не сможет закрыться.
в) сделайте скриншот этого окна и выложите в своем следующем сообщении.
 

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#12
Батник запускаете случайно не через ПКМ -> "От имени администратора"
Да, именно так.
2. Напишите, как обозвали файл батника.
bat.bat
3. Давайте еще попробуем так:
вылет.jpg
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#13
Victoreva, батник не падает. Вы скорее всего, когда дописывали pause, то поставили его после goto :eof, а нужно было "до".
Батник существенно отличается от моего тем, что нет перехода в текущей каталог командой:
Код:
cd /d "%~dp0"
по этой причине при запуске с повышенными привилегиями происходит переход в системный каталог.
А поскольку Вы не указываете полный путь к файлу xml.txt, батник не может его найти.

Нужно сделать что-то одно, или указать полный путь к файлу, или дописать указанную мною команду.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#15

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#16
Подскажите еще, пожалуйста. Есть строка следующего содержания:
CMD/BATCH:
for /f "UsebackQ delims=" %%a in (` autorunsc.exe -a ^|findstr /n /R "File\not\found"`) do (
Так вот, как мне явно указать путь к файлу autorunsc.exe. Батник и утилита находятся в одной родительской директории, но в разных папках. То есть утилита лежит например в bat\utilite, а сам батник например в bat\bat. Интересует именно вариант в этой строке, то есть без предварительного
CMD/BATCH:
cd ..
cd "utilite"
И еще такой вопрос - от-того, что я напишу так:
CMD/BATCH:
copy /y> nul "%result1%"
вместо:
CMD/BATCH:
copy /y  nul "%result1%"
Поменяется ведь только то, что в первом случае в командной строке не будет отображена надпись об успешном копировании?
Скопировано файлов: 1.
Или смысл изменится?
Или правильнее будет написать:
CMD/BATCH:
copy /y>nul nul "result1%"
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#17
Поменяется ведь только то, что в первом случае в командной строке не будет отображена надпись об успешном копировании?
Скопировано файлов: 1.
Или смысл изменится?
Изменится.
В первом случае Вы пытаете скопировать файл поверх самого себя, занулив ответ от команды copy.
От перестановки позиции лексемы перенаправления ( >NUL ) "сумма не меняется". Т.е. следующие конструкции аналогичны по смыслу:
Код:
copy /y nul "result1%" >nul
>nul copy /y nul "result1%"
copy /y>nul nul "result1%"
(я расположил их в порядке частоты использования). 1 - чаще всего, 2 - реже, 3 - практически никогда.

То есть утилита лежит например в bat\utilite, а сам батник например в bat\bat.
Код:
cd /d "%~dp0"
for /f "delims=" %%a in ('..\utilite\autorunsc.exe -a ^|findstr /INC:"File not found"') do (
 

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#18
cd /d "%~dp0"
for /f "delims=" %%a in ('..\utilite\autorunsc.exe -a ^|findstr /INC:"File not found"') do (
Я же попросил без cd /d "%~dp0". У меня просто какая задача стоит: я запускаю батник bat1.bat из одного места например bat\n1 потом внутри него переходу как раз таки командой cd в другую папку(bat\Files) для перекодировки\записи вывода результата команды в файл, но при этом команда, это сторонняя утилита и лежит она в папке (bat\n2). Поэтому переходить в эту папку не надо, так как иначе файл не запишется куда надо. Нужно просто указать место, откуда будет выполняться эта утилита.
Может как то записать относительный путь в переменную и потом ее использовать я не знаю.

Вот код как полностью выглядит:

CMD/BATCH:
cd /d "%~dp0"
cd ..\Files
SetLocal EnableExtensions EnableDelayedExpansion
set result2=autoplay1.txt

chcp 1251> nul
set q1=Ничего не найдено
chcp 866> nul


copy /y> nul nul "%result2%"

set CpReady=
for /f "UsebackQ delims=" %%a in (`autorunsc.exe -a ^|findstr /n /R "File\not\found"`) do (
  if not defined cpReady (chcp 1251 >nul& set CpReady=True)
  call :convert "%%a"
)

goto :eof
:convert
::>>"%result2%" cmd /c echo.%~1


chcp 866> nul
for /f %%a in ("%result2%") do if "%%~za"=="0" (goto :mnb1 ) else goto :mnbbvv1



:mnb1

echo %q1%
del autoplay1.txt


:mnbbvv1
autorunsc.exe -a ^|findstr /n /R "File\not\found"
del autoplay1.txt
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#19
Я же попросил без cd /d "%~dp0"
Вы такого не просили. Цитирую Вас:
Victoreva написал(а):
то есть без предварительного
CMD/BATCH:
cd ..
cd "utilite"
Без него все гораздо усложняется.
Как я уже говорил:
при запуске с повышенными привилегиями происходит переход в системный каталог.
без перехода в каталог батника у Вас есть 2 варианта:
1) указывать полный путь к утилите
2) Добавить полный путь к утилите в переменную Path.

потом внутри него переходу как раз таки командой cd в другую папку(bat\Files)
Вы это не сможете сделать, если будете запускать батник ПКМ "От имени администратора"
и не используя переход в каталог батника командой cd.

Как сделать правильно я Вам уже написал. Если эта команда (как я вижу) у Вас уже указана первой строкой батника, нет необходимости ее дублировать в поданном мною примере.
 

Victoreva

Пользователь
Сообщения
57
Симпатии
2
#20
1) указывать полный путь к утилите
2) Добавить полный путь к утилите в переменную Path.
Ну вот как раз проблема в том, что путь то относительный. Как правильно указать его?
CMD/BATCH:
for /f "UsebackQ delims=" %%a in (`"..\n2\autorunsc.exe" -a ^|findstr /n /R "File\not\found"`)