Компьютерный форум 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=335849)

bredych 23-07-2018 22:09 2823208

Поиск строки, содержащей текст, и копирование её в лог
 
Поиск строки, содержащей текст, и копирование её в лог.
Для кучи файлов, расположенных НЕ в одной папке, но внутри одного куста. Файлы НЕ имеют разрешения, потому фильтрация по типу файлов, используемая в разных примерах, не годится

Для файлов, лежащих в одной папке, срaбатывает код

Код:

@echo off
setlocal enableextensions
set FLOG=%~n0.log
set "SOURCE=D:\pics\2\"
pushd "%SOURCE%"
(for /f "tokens=1,* delims=:" %%a in ('findstr /i /l /c:"mystring" "*.*"') do (
  echo(%%b
  )) > %FLOG%
popd

я добавил строку листинга директории с выводом краткой записи всех файлов из всего дерева в список и поиска среди них,

Код:

@echo off
setlocal enableextensions
set FLOG=%~n0.log
set "SOURCE=D:\pics\2\"
pushd "%SOURCE%"
for /f "delims=" %%i in ('dir /b /s *.*') do
(for /f "tokens=1,* delims=:" %%a in ('findstr /i /l /c:"mystring" "*.*"') do (
  echo(%%b
  )) > %FLOG%
popd

но ругается "некорректный синтаксис".
Где косячу - не понимаю ((

Iska 24-07-2018 00:10 2823218

Цитата:

Цитата bredych
Где косячу - не понимаю (( »

Здесь:
Код:

findstr.exe /i /l /s /c:"mystring" "D:\pics\2\*.*"
Цитата:

Цитата bredych
Файлы НЕ имеют разрешения, потому фильтрация по типу файлов, используемая в разных примерах, не годится »

Переведите, пожалуйста, на русский.

mwz 24-07-2018 01:22 2823220

Цитата:

Цитата Iska
Переведите, пожалуйста, на русский. »

Похоже что человек путает слова "расширение" и "разрешение". ;)

bredych 24-07-2018 11:14 2823248

Цитата:

Цитата Iska
c:"mystring" "D:\pics\2\*.*" »

а разве замена "текущей папки" на указанную в переменной -
Код:

pushd "%SOURCE%"
недостаточна, надо всё равно указывать путь к ней?
по идее, первый вариант отлично текущую папку меняет и лог создаётся в ней, а не папке батника, почему здесь потребовалось добавлять?

зы, да, расширение наверно ,более точный перевод extension

megaloman 24-07-2018 11:29 2823252

Цитата:

Цитата bredych
Файлы НЕ имеют разрешсширения, »

Маска при этом "*."

Iska 24-07-2018 11:57 2823258

Цитата:

Цитата bredych
а разве замена "текущей папки" на указанную в переменной - … недостаточна»

В использовании pushd здесь вообще нет особого смысла. Весь код умещается фактически в одну строку (с добавлением вывода в лог и отсутствием расширения в маске файлов):
Код:

>"D:\pics\2\%~n0.log" findstr.exe /i /l /s /c:"mystring" "D:\pics\2\*."
Если вынести определение целевого каталога (здесь — D:\pics\2) отдельной переменной окружения — то в две.

megaloman 24-07-2018 12:07 2823264

Если в логе не нужно имя файла, то
Код:

@Echo Off

Set "FLOG=%~n0.log"
Set "SOURCE=Z:\Soft_In\тра ля ля"
Set "Mask=*."
Set "mystring=над крылечком дым колечком"

>"%SOURCE%\%FLOG%" (For /f "tokens=2* delims=:" %%i in ('findstr /i /l /s  /c:"%mystring%" "%SOURCE%\%Mask%"') Do Echo %%j)

Примечание: у меня скверная привычка все параметры, которые могут подстраиваться под задачу, выносить вверх, за счет этого много строк.

Iska 24-07-2018 12:12 2823265

Цитата:

Цитата megaloman
Примечание: у меня скверная привычка все параметры, которые могут подстраиваться под задачу, выносить вверх, »

Это хорошая, правильная привычка.

bredych 24-07-2018 12:19 2823267

Цитата:

Цитата megaloman
Маска при этом "*." »

а он не будет так искать с точкой в конце имени?

Цитата:

Цитата Iska
>"D:\pics\2\%~n0.log" findstr.exe /i /l /s /c:"mystring" "D:\pics\2\*." »

ээ... хм.. но если вывод в лог сначала, то лог же пустой должен быть, в буфере же еще ничего нет до обработки команды... почему он всё равно даёт?
Цитата:

Цитата Iska
В использовании pushd здесь вообще нет особого смысла. »

ну, собсно, в плане обучения правильному подходу - всё выносить в переменные, чтоб потом не искать баги.. но в одну строку действительно код красивее. Только одна деталь: он даёт и имена файлов тоже. А мне эотго не надо, мне только саму строку.
Так что, походу, придется ограничиться добавкой одного ключа /s , а фильтрацию вывода (только после двоеточия) оставить.

Цитата:

Цитата megaloman
у меня скверная привычка »

я пытаюсь её вырабатывать у себя :)
спасибо :)

Iska 24-07-2018 12:32 2823270

Цитата:

Цитата bredych
а он не будет так искать с точкой в конце имени? »

Только в одном случае — если у него не будет расширения.

Цитата:

Цитата bredych
ээ... хм.. но если вывод в лог сначала, то лог же пустой должен быть, в буфере же еще ничего нет до обработки команды... почему он всё равно даёт? »

Это не «сначала». Перенаправление потоков может быть указано хоть перед командой, хоть после.

Цитата:

Цитата bredych
он даёт и имена файлов тоже. А мне эотго не надо, мне только саму строку. »

Смотрите код коллеги megaloman, он как раз о том.

mwz 24-07-2018 12:38 2823272

Цитата:

Цитата bredych
а он не будет так искать с точкой в конце имени? »

А вы попробуйте такой файл создать. ;)

megaloman 24-07-2018 18:20 2823319

Цитата:

Цитата Iska
В использовании pushd здесь вообще нет особого смысла. »

Если в логе не нужно имя файла, то смысл есть. Мы получаем бOльшую свободу в задании пути: можно, например, задавать путь в виде
D:\folder либо \\сетевой ресурс\шара
без переделки батника
Код:

@Echo Off

Set "FLOG=%~n0.log"

rem Set "SOURCE=Z:\Soft_In\тра ля ля"
Set "SOURCE=\\192.168.1.1\test1\Soft_In\тра ля ля"

Set "Mask=*."
Set "mystring=над крылечком дым колечком"

Pushd "%SOURCE%" &&(
>"%FLOG%" (For /f "tokens=1* delims=:" %%i in ('findstr /i /l /s  /c:"%mystring%" "%Mask%"') Do Echo %%j)
popd)

Что касается привычек, то они вырабатываются опытом работы в команде. И, кроме того, через пару месяцев вы сэкономите своё же время при необходимости изменить минимум в батнике: исходные данные

Iska 24-07-2018 18:59 2823327

Цитата:

Цитата megaloman
Мы получаем бOльшую свободу в задании пути: можно, например, задавать путь в виде
D:\folder либо \\сетевой ресурс\шара
без переделки батника »

megaloman, всё равно не пойму, в чём принципиальная разница по сравнению с этим:
Код:

Set "SOURCE=\\192.168.1.1\test1\Soft_In\тра ля ля"

>"%SOURCE%\%FLOG%" (For /f "tokens=1* delims=:" %%i in ('findstr /i /l /s  /c:"%mystring%" "%SOURCE%\%Mask%"') Do Echo %%j)

?!

megaloman 24-07-2018 21:08 2823352

Iska, вот примеры из того, что у меня есть под руками. Находимся Z:\

В командной строке делаем
findstr /i /l /s /c:"wmic" "Z:\Soft_In\тра ля ля\*.bat"

Получаем результат
Z:\Soft_In\тра ля ля\я180527.bat:wmic fsdir where "name='%DirName%'" get 'CreationDate' /format:csv

В командной строке делаем
findstr /i /l /s /c:"wmic" "Soft_In\тра ля ля\*.bat"

Получаем результат
Soft_In\тра ля ля\я180527.bat:wmic fsdir where "name='%DirName%'" get 'CreationDate' /format:csv

Аналогично при задании пути \\192.168.1.1\test1\Soft_In\тра ля ля"

Если в командном файле в For delims=: то номер токена при разборе придётся указывать свой в зависимости от способа описания пути

Применение Pushd в командном файле и
findstr /i /l /s /c:"wmic" "*.bat"

даёт возможность в любом случае брать для вывода второй токен.

Iska 25-07-2018 01:29 2823371

megaloman, спасибо, ясно.

Первый пример несколько натянут, вполне можно перейти от относительного к абсолютному пути. Со вторым же вариантом:
Цитата:

Цитата megaloman
при задании пути \\192.168.1.1\test1\Soft_In\тра ля ля" »

соглашусь.

YuS_2 25-07-2018 06:09 2823376

Цитата:

Цитата Iska
всё равно не пойму, в чём принципиальная разница по сравнению с этим »

Как пример, необходимость выполнения кода:
Код:

findstr /i /l /s  /c:"%mystring%" "%SOURCE%\%Mask%"
в нескольких каталогах. Достаточно будет осуществлять переходы pushd (или cd), иначе придется дублировать целиком конструкции самого кода с путями...
Кроме того:
Цитата:

Цитата Iska
можно перейти от относительного к абсолютному пути »

Если в выводе команды будут присутствовать только имена файлов, без перехода мы не получим правильные абсолютные пути к ним:
Код:

for /f "delims=" %%i in ('dir /b/a-d "c:\temp\*.*") do echo %%~dpfi
- неправильно, если текущий каталог не равен "c:\temp"...
в отличие от:
Код:

set "d=C:\TEMP"
pushd "%d%"
for /f "delims=" %%i in ('dir /b/a-d "*.*"') do echo %%~dpfi
popd


Iska 25-07-2018 07:42 2823379

YuS_2, Ваши комментарии понятны, но они не по делу и не по существу данног конкретного вопроса, в отличие от разъяснения коллеги megaloman.

YuS_2 25-07-2018 08:52 2823386

Цитата:

Цитата Iska
не по существу данног конкретного вопроса »

Это да, но привычка использования конкретных способов, это дело такое: напишешь код, а потом придется разбираться, почему не работает или почему коллега никак не может твой код поправить, или почему вдруг поправляет, но с помощью простого трехэтажного... :)
в общем, главная мысль в комментариях:
Цитата:

Цитата megaloman
Что касается привычек, то они вырабатываются опытом работы в команде. И, кроме того, через пару месяцев вы сэкономите своё же время при необходимости изменить минимум в батнике: исходные данные »

и ничего более... в смысле, речь про принципиальную разницу

bredych 15-03-2019 09:57 2863226

возникла похожая задачка...
Убить все задачи планировщика, где в имени встречается слово OneDrive. А имя там может включать в себя всякие уиды и черте-что еще.
Пока логика подсказывает громоздкую конструкцию из 3 циклов:

1) schtasks /query >%logfile%
2) findstr.exe /b /i /l /c:"Onedrive" >%log2%
3) for /f "tokens=1 delims= " %%i in (%log2%) schtasks /delete /tn "%%i" /f

но наверняка же можно это сделать как-то изящнее?

Iska 15-03-2019 10:19 2863229

bredych, упакуйте содержимое полученного %logfile% в архив, каковой приложите к сообщению.

bredych 15-03-2019 11:13 2863243

Вложений: 1
Цитата:

Цитата Iska
упакуйте содержимое полученного »

с имеющейся машинкой уже несколько поздно, еще вчера удалил эти задачи ручками, но на будущее хотелось бы автоматизировать, бо забуду всё...
Если вы про пробелы в имени задачи - они были, да.
Что-то типа "OneDrive update ...-(S-1-5-21-2686153969-1940417165-1241769948)"

Iska 15-03-2019 17:05 2863299

bredych, мне в архиве как раз нужно видеть эти задачи. Сделаете — выкладывайте.


Время: 05:09.

Время: 05:09.
© OSzone.net 2001-