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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Victoreva, 5 мар 2015.

  1. Victoreva
    Оффлайн

    Victoreva Новый пользователь

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

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Немного по другому спрошу- у меня есть последовательность команд типа :
    Код (DOS):

    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/
     
    Последнее редактирование модератором: 5 мар 2015
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Дозапись это знак >>

    Код (DOS):
    @echo off
    SetLocal EnableExtensions
    for /F "UsebackQ delims=" %%a in ("%~dp0dir.txt") do notepad "%%~a"
     
    --- Объединённое сообщение, 5 мар 2015 ---
    P.S. Одной командой должно искать в 2 раза быстрее:

    Код (DOS):
    dir с:\unattend.xml c:\services.xml /s /b> "%~dp0dir.txt"
     
  4. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    А как сделать, чтобы батник начинал открывать файлы только если не пуст сам файл, в котором хранятся записи. Я попробовал написать так, используя ваши предыдущие подсказки:
    Код (Text):

    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"
     
    но видимо я не правильно написал логическое не равно (!=) не смог найти в что-то.
     
    Последнее редактирование модератором: 9 мар 2015
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Справка:
    Код (Text):
    if /?
    Код (Text):

    @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"
     
     
  6. Victoreva
    Оффлайн

    Victoreva Новый пользователь

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    А Вы русские буквы "c" на латинские поменяйте :)
    и ключ /a допишите к команде dir, чтобы скрытые атрибуты не пропускала.
     
  8. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Подскажите где ошибка? Батник должен считывать пути файлов с текстового документа и открывать их в Internet Epxlorer, если в этом файле записей нет, то на экране появляется сообщение: Ничего не найдено.
    Код (DOS):
    :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
    ................
    У меня батник просто вылетает.
     
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Не вылетает - просто завершается. Если поставить в конце pause, это будет видно.
    А если и будет вылетать, можно запустить CMD.exe, а из него батник. Там будет видно на чем "вылетело".

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

    @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
     
     
    Kиpилл и Victoreva нравится это.
  10. Victoreva
    Оффлайн

    Victoreva Новый пользователь

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

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

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Да, именно так.
    bat.bat
    вылет.jpg
     
  13. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Victoreva, батник не падает. Вы скорее всего, когда дописывали pause, то поставили его после goto :eof, а нужно было "до".
    Батник существенно отличается от моего тем, что нет перехода в текущей каталог командой:
    Код (Text):
    cd /d "%~dp0"
    по этой причине при запуске с повышенными привилегиями происходит переход в системный каталог.
    А поскольку Вы не указываете полный путь к файлу xml.txt, батник не может его найти.

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

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Pause я вообще не писал нигде.
    Ну да, зато я пишу так ...> "%~dp0xml.txt". Все я понял, я в цикле как раз не прописал %~dp0. Недоглядел, спасибо.
     
  15. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Это я объяснил по поводу начального поста:
     
  16. Victoreva
    Оффлайн

    Victoreva Новый пользователь

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Изменится.
    В первом случае Вы пытаете скопировать файл поверх самого себя, занулив ответ от команды copy.
    От перестановки позиции лексемы перенаправления ( >NUL ) "сумма не меняется". Т.е. следующие конструкции аналогичны по смыслу:
    Код (Text):

    copy /y nul "result1%" >nul
    >nul copy /y nul "result1%"
    copy /y>nul nul "result1%"
     
    (я расположил их в порядке частоты использования). 1 - чаще всего, 2 - реже, 3 - практически никогда.

    Код (Text):

    cd /d "%~dp0"
    for /f "delims=" %%a in ('..\utilite\autorunsc.exe -a ^|findstr /INC:"File not found"') do (
     
     
  18. Victoreva
    Оффлайн

    Victoreva Новый пользователь

    Сообщения:
    57
    Симпатии:
    2
    Я же попросил без cd /d "%~dp0". У меня просто какая задача стоит: я запускаю батник bat1.bat из одного места например bat\n1 потом внутри него переходу как раз таки командой cd в другую папку(bat\Files) для перекодировки\записи вывода результата команды в файл, но при этом команда, это сторонняя утилита и лежит она в папке (bat\n2). Поэтому переходить в эту папку не надо, так как иначе файл не запишется куда надо. Нужно просто указать место, откуда будет выполняться эта утилита.
    Может как то записать относительный путь в переменную и потом ее использовать я не знаю.

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

    Код (DOS):
    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

     
     
  19. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Вы такого не просили. Цитирую Вас:
    Без него все гораздо усложняется.
    Как я уже говорил:
    без перехода в каталог батника у Вас есть 2 варианта:
    1) указывать полный путь к утилите
    2) Добавить полный путь к утилите в переменную Path.

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

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

    Victoreva Новый пользователь

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

Поделиться этой страницей