Показать полную графическую версию : [решено] Поиск строки, содержащей текст, и копирование её в лог
Поиск строки, содержащей текст, и копирование её в лог.
Для кучи файлов, расположенных НЕ в одной папке, но внутри одного куста. Файлы НЕ имеют разрешения, потому фильтрация по типу файлов, используемая в разных примерах, не годится
Для файлов, лежащих в одной папке, ср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
но ругается "некорректный синтаксис".
Где косячу - не понимаю ((
Где косячу - не понимаю (( »
Здесь:
findstr.exe /i /l /s /c:"mystring" "D:\pics\2\*.*"
Файлы НЕ имеют разрешения, потому фильтрация по типу файлов, используемая в разных примерах, не годится »
Переведите, пожалуйста, на русский.
Переведите, пожалуйста, на русский. »
Похоже что человек путает слова "расширение" и "разрешение". ;)
c:"mystring" "D:\pics\2\*.*" »
а разве замена "текущей папки" на указанную в переменной -
pushd "%SOURCE%"
недостаточна, надо всё равно указывать путь к ней?
по идее, первый вариант отлично текущую папку меняет и лог создаётся в ней, а не папке батника, почему здесь потребовалось добавлять?
зы, да, расширение наверно ,более точный перевод extension
megaloman
24-07-2018, 11:29
Файлы НЕ имеют разрешсширения, » Маска при этом "*."
а разве замена "текущей папки" на указанную в переменной - … недостаточна»
В использовании 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
Если в логе не нужно имя файла, то @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)
Примечание: у меня скверная привычка все параметры, которые могут подстраиваться под задачу, выносить вверх, за счет этого много строк.
Примечание: у меня скверная привычка все параметры, которые могут подстраиваться под задачу, выносить вверх, »
Это хорошая, правильная привычка.
Маска при этом "*." »
а он не будет так искать с точкой в конце имени?
>"D:\pics\2\%~n0.log" findstr.exe /i /l /s /c:"mystring" "D:\pics\2\*." »
ээ... хм.. но если вывод в лог сначала, то лог же пустой должен быть, в буфере же еще ничего нет до обработки команды... почему он всё равно даёт?
В использовании pushd здесь вообще нет особого смысла. »
ну, собсно, в плане обучения правильному подходу - всё выносить в переменные, чтоб потом не искать баги.. но в одну строку действительно код красивее. Только одна деталь: он даёт и имена файлов тоже. А мне эотго не надо, мне только саму строку.
Так что, походу, придется ограничиться добавкой одного ключа /s , а фильтрацию вывода (только после двоеточия) оставить.
у меня скверная привычка »я пытаюсь её вырабатывать у себя :)
спасибо :)
а он не будет так искать с точкой в конце имени? »
Только в одном случае — если у него не будет расширения.
ээ... хм.. но если вывод в лог сначала, то лог же пустой должен быть, в буфере же еще ничего нет до обработки команды... почему он всё равно даёт? »
Это не «сначала». Перенаправление потоков может быть указано хоть перед командой, хоть после.
он даёт и имена файлов тоже. А мне эотго не надо, мне только саму строку. »
Смотрите код (http://forum.oszone.net/post-2823264.html#post2823264) коллеги megaloman, он как раз о том.
а он не будет так искать с точкой в конце имени? »
А вы попробуйте такой файл создать. ;)
megaloman
24-07-2018, 18:20
В использовании 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)Что касается привычек, то они вырабатываются опытом работы в команде. И, кроме того, через пару месяцев вы сэкономите своё же время при необходимости изменить минимум в батнике: исходные данные
Мы получаем б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
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"
даёт возможность в любом случае брать для вывода второй токен.
megaloman, спасибо, ясно.
Первый пример несколько натянут, вполне можно перейти от относительного к абсолютному пути. Со вторым же вариантом:
при задании пути \\192.168.1.1\test1\Soft_In\тра ля ля" »
соглашусь.
всё равно не пойму, в чём принципиальная разница по сравнению с этим »
Как пример, необходимость выполнения кода:
findstr /i /l /s /c:"%mystring%" "%SOURCE%\%Mask%"
в нескольких каталогах. Достаточно будет осуществлять переходы pushd (или cd), иначе придется дублировать целиком конструкции самого кода с путями...
Кроме того:
можно перейти от относительного к абсолютному пути »
Если в выводе команды будут присутствовать только имена файлов, без перехода мы не получим правильные абсолютные пути к ним:
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
YuS_2, Ваши комментарии понятны, но они не по делу и не по существу данног конкретного вопроса, в отличие от разъяснения коллеги megaloman.
не по существу данног конкретного вопроса »
Это да, но привычка использования конкретных способов, это дело такое: напишешь код, а потом придется разбираться, почему не работает или почему коллега никак не может твой код поправить, или почему вдруг поправляет, но с помощью простого трехэтажного... :)
в общем, главная мысль в комментариях:
Что касается привычек, то они вырабатываются опытом работы в команде. И, кроме того, через пару месяцев вы сэкономите своё же время при необходимости изменить минимум в батнике: исходные данные »
и ничего более... в смысле, речь про принципиальную разницу
возникла похожая задачка...
Убить все задачи планировщика, где в имени встречается слово 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
но наверняка же можно это сделать как-то изящнее?
bredych, упакуйте содержимое полученного %logfile% в архив, каковой приложите к сообщению.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.