Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск и отображение содержимого файла (http://forum.oszone.net/showthread.php?t=201444)

ConMan 08-03-2011 19:37 1630158

Поиск и отображение содержимого файла
 
Ребят, мне нужно написать пакетный файл, предназначенный для организации процесса поиска и отображения текстового файла. Поиск осуществляется по всем локальным дискам. Имя текстового файла задается пакетным параметром. После того как необходимый файл найден,в автоматическом режиме осуществляется его отображение в текстовом процессоре Блокнот.

Поддержите пожалуйста:)

Iska 08-03-2011 20:45 1630206

Например, так:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sName=%~1

if not defined sName echo Usage: %~nx0 ^<filename^>& exit /b 1

for /f "usebackq skip=1" %%i in (
        `wmic.exe LogicalDisk WHERE "DriveType='3'" GET Caption`
) do (
        for /f "tokens=*" %%j in (
                'dir /b /s /a:-d "%%i\%sName%"'
        ) do start "" "%systemroot%\System32\notepad.exe" "%%j"
)

endlocal
exit /b 0

Поиск будет вестись по всем локальным несъёмным дискам. Все найденные файлы будут открыты в Блокнотах.

ConMan 08-03-2011 22:26 1630270

Спасибо за ответ. Попробовал, командная строка открывается и тут же закрывается, где то паузы не хватает мб?

Iska 08-03-2011 22:46 1630283

Цитата:

командная строка открывается и тут же закрывается
«Win-R», «cmd.exe», «Enter» — и уже в окне командного процессора запускать пакетный файл. Либо пользоваться Far Manager'ом.

ConMan, попробуйте для начала отдельно выполнить там же это:
Код:

wmic.exe LogicalDisk WHERE "DriveType='3'" GET Caption
Что видите?

ConMan 08-03-2011 22:52 1630291

Всё, работает, премного благодарю:)

Iska 08-03-2011 23:04 1630299

ConMan, возможно, Вы до этого ни разу не запускали «wmic.exe» — при первом запуске она выдаёт несколько больше информации, чем требовалось.

Iska 17-03-2011 17:46 1637189

Из письма в ПМ:
Цитата:

Цитата ConMan
…если не затруднит, напиши комментарии пожалуйста к коду, который ты мне написала: http://forum.oszone.net/thread-201444.html.

Не затруднит.

Проверяем, был ли вызван пакетный файл с аргументом или без. Для этого:

1. Присваиваем переменной окружения «sName» первый аргумент пакетного файла:
Код:

set sName=%~1
Если пакетный файл был вызван без аргумента (т.е. «%~1» — пусто), то команда, наоборот, удалит переменную «sName».

2. Теперь проверяем, определена ли переменная окружения «sName»:
Код:

if not defined sName …
И, если — нет, выводим сообщение об использовании пакетного файла и завершаем его работу:
Код:

…echo Usage: %~nx0 ^<filename^>& exit /b 1
«%~nx0» — расширяет стандартную переменную окружения «%0» (имя пакетного файла) до имени («n») и расширения («x») (читаем справку «call /?»).
Символы перенаправления «<» и «>» для вывода экранируем с помощью «^».

Код:

for /f "usebackq skip=1" %%i in (
        `wmic.exe LogicalDisk WHERE "DriveType='3'" GET Caption`
) do …

«wmic.exe LogicalDisk WHERE "DriveType='3'" GET Caption» выводит информацию о буквах («Caption») разделов («LogicalDisk») жёстких несъемных дисков («DriveType='3'»), наподобие:
Код:

Caption
C:
D:
E:
F:
H:

разбор которой мы делаем с помощью «for /f».

В команде «wmic.exe» используются как одинарные, так и двойные кавычки. Посему используем новую семантику обработки строки: «usebackq», а саму команду заключаем в обратные кавычки.

Строка заголовка «Caption» нам не нужна — отсекаем её («skip=1»). Получившиеся буквы дисков используем дальше как «%%i» в:
Код:

        for /f "tokens=*" %%j in (
                'dir /b /s /a:-d "%%i\%sName%"'
        ) do …

Здесь мы просто запускаем рекурсивный («/s») поиск («dir») файла («%sName%») для каждой из найденных выше букв разделов («%%i»), отсекая при этом папки («/a:-d») и оставляя в выводе только полный путь к файлу («/b»).

Далее мы запускаем Блокнот для каждого из найденных файлов:
Код:

start "" "%systemroot%\System32\notepad.exe" "%%j"
Кавычки «""», указанные сразу после «start» — это пустая строка заголовка. Если не указать здесь пустые кавычки, то команда «start» воспримет в качестве заголовка строку «"%systemroot%\System32\notepad.exe"». Подробности, как обычно, в «start /?».

Примерно так.

P.S. Подобные вопросы следует задавать непосредственно в теме, ибо:
* ответ в любом случае появится там же, поскольку ограничение на размер письма в ПМ не позволяет ответить иначе, нежели в теме;
* задавая вопрос не на форуме, а одному человеку в ПМ, Вы резко сокращаете аудиторию, которая могла бы дать Вам ответ. Помимо Iska на форуме более чем достаточно участников, могущих и умеющих помочь.

P.P.S.
Цитата:

Цитата ConMan
…который ты мне написала…

:). Аз есмь «душа мужеска полу»: как «Никита», «Гаврила», «Илья» и т.п.

ConMan 17-03-2011 21:15 1637390

!!!!! Спасибо, добрый человек:)

apostroff 06-10-2011 11:42 1767122

еще раз здравствуйте,у меня попалось точно такое же задание,но после использования батника,он выдает

И, если — нет, выводим сообщение об использовании пакетного файла и завершаем его работу:

Код:
…echo Usage: %~nx0 ^<filename^>& exit /b 1

как сделать что бы он определял переменную окружения???

Iska 06-10-2011 12:40 1767179

apostroff, нет нужды дублировать свои посты сообщением в личку.

Ваш вопрос не понятен. Начните с формулировки:
Цитата:

Цитата apostroff
у меня попалось точно такое же задание »

именно Вашего задания. Затем как-то перефразируйте это:
Цитата:

Цитата apostroff
но после использования батника,он выдает
И, если — нет, выводим сообщение об использовании пакетного файла и завершаем его работу:
Код:
…echo Usage: %~nx0 ^<filename^>& exit /b 1
как сделать что бы он определял переменную окружения??? »

так, чтобы появился смысл.

apostroff 06-10-2011 14:24 1767298

Разобрался.)просто не хватало терпения:)жесткий на 2 тб .
Спасибо все работает:)

SAPRICOMANDA 18-06-2013 21:23 2170272

Помогите пожалуйста выполнить в точности тоже задание только на Unix

Iska 18-06-2013 22:13 2170335

SAPRICOMANDA, Вы не в тот раздел попали. Вам куда-то сюда: Программирование в *nix.

IIypsik 24-11-2016 19:01 2690288

И снова здравствуйте)
код: if not defined sName echo Usage: %~nx0 ^<filename^>& exit /b 1
условие выполняется, то есть результат - Usage: name.bat, далее ничего
прикладываю скрин по wmic.exe. локальные диски то он находит. где копать?
Цитата:

Цитата Iska
ConMan, попробуйте для начала отдельно выполнить там же это:
Код:
wmic.exe LogicalDisk WHERE "DriveType='3'" GET Caption
Что видите? »


IIypsik 24-11-2016 19:02 2690289

Вложений: 1
Скрин:

Iska 24-11-2016 19:20 2690295

IIypsik, смотрите:
Цитата:

Цитата ConMan
Имя текстового файла задается пакетным параметром. »

То есть, Вы должны открыть командную строку, Far Manager, Total Commander, або ещё что, и указать в качестве параметра пакетного файла имя искомого текстового файла, например:
Код:

"name.bat" "My text file.txt"

IIypsik 24-11-2016 19:24 2690296

Iska, а если set /p использовать с переменной средой?вводить же тогда пользователь будет, что он хочет найти. Или я Вас не понял? :D

Iska, дошло, спасибо, все получилось. :up

Iska 24-11-2016 20:24 2690309

Цитата:

Цитата IIypsik
Iska, а если set /p использовать с переменной средой?вводить же тогда пользователь будет, что он хочет найти. »

Можно. Вместо «set sName=%~1». Но для целей автоматизации это не так удобно.


Время: 06:01.

Время: 06:01.
© OSzone.net 2001-