|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках. |
|
CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.
|
Новый участник Сообщения: 2 |
Профиль | Отправить PM | Цитировать Здравствуйте, очень нужна помощь в решении следующей задачи!
Есть папка .\temp в которой находятся файлы и подпапки то же с файлами. Нужно найти htm- и js-файлы с ключевым набором символов, например - "_temp" и удалить строки, в которых он встречается. При чем, как в папке, где находится мой батник, так и во всех подпапках. Я тут набросал, но к сожалению не работает - SetLocal EnableExtensions :: маска htm-файлов set mask_htm=*.htm :: маска js-файлов set mask_js=*.js :: перфикс для новых файлов set prefix=p_tmp_pref_ :: ключевое слово, которое необходимо удалить. set StringForDelete=_temp :: Создание новых файлов с уже вырезанными ключевыми словами For /F "delims=" %%a in ('dir /b "%cd%\%mask_htm%"') do ( :: if NOT %%a == %NameBat% ( < "%%a" find /I /V "%StringForDelete%" > "%cd%\%prefix%%%a" ) For /F "delims=" %%a in ('dir /b "%cd%\%mask_js%"') do ( :: if NOT %%a == %NameBat% ( < "%%a" find /I /V "%StringForDelete%" > "%cd%\%prefix%%%a" ) :: Удаление файлов, в которых были найдены ключевые слова. For /F "delims=" %%b in ('dir /b "%cd%\%mask_htm%" ^| find /i /v "%prefix%"') do ( del /q "%%b" ) For /F "delims=" %%b in ('dir /b "%cd%\%mask_js%" ^| find /i /v "%prefix%"') do ( del /q "%%b" ) :: Переименование файлов с вырезанными ключевыми словами. For /f %%d in ('dir /b "%cd%\%prefix%*"') do ( for /f "tokens=* delims=\%prefix%" %%n in ('echo %%d') do ( ren "%%d" "%%n" ) ) |
|
Отправлено: 09:57, 18-06-2019 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать Цитата BerryMOR:
еще может быть что я неправильно понимаю задачу или напротив, вы неправильно ее формулируете, возможно условие должно звучать так: Найти все файлы ... в имени которых встречается "_temp" и переименовать их, вырезав искомое сочетание. Но в таком случае надо предусмотреть как поступить в случае совпадения имен после вырезания искомой вставки. |
|
Последний раз редактировалось alpap, 19-06-2019 в 08:54. Отправлено: 08:45, 19-06-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Не представлял, когда начинал это делать. Сейчас уже представляю. Задача мной сформулирована корректно.
Но надеялся, что может найдется гуру, кто предложит решение. Я искал-искал, но не смог. Если нет, то наверное сделаю консольку на с# каком-нибудь. Жаль конечно потраченного времени. Но что ж поделаешь, если изначально не смог правильно оценить возможности инструментария. Будет наука. |
Отправлено: 11:07, 19-06-2019 | #3 |
Crazy Сообщения: 1167
|
Профиль | Отправить PM | Цитировать Цитата BerryMOR:
|
|
------- Отправлено: 18:05, 19-06-2019 | #4 |
Ветеран Сообщения: 2703
|
Профиль | Отправить PM | Цитировать BerryMOR,
Если задача Вами сформулирована корректно и мной правильно понята, то вот vbs
RegExp = ".*\.htm|.*\.js" Text = "_temp" BoxIn = "Z:\Box_In\temp" ' BoxIn = "temp" ' Если скрипт забросить в папку где подпапка temp ' BoxIn = Replace(WScript.ScriptFullName, WScript.ScriptName, "") + BoxIn Set Mask = CreateObject("VBScript.RegExp") Mask.Pattern = RegExp Mask.IgnoreCase = True Mask.Global = True j = 0 Call AllFold(BoxIn, Mask, Text, CreateObject("Scripting.FileSystemObject"), j) MsgBox "Обработано " + CStr(j) + " файлов" Sub AllFold(inDir, Msk, Txt, FO, j) ' --------------------------------------------- With FO Set Fold = .GetFolder(inDir) Set Files = Fold.Files For Each iFile In Files ' Цикл по файлам в папке If Msk.Test(iFile.Name) Then If iFile.Size > 0 Then Set Fin = .OpenTextFile(iFile, 1, False) Tall = Fin.ReadAll Fin.Close Tall = RTrim(Tall) If Right(Tall, 2) = vbCrLf Then Tall = Mid(Tall, 1, Len(Tall) - 2) If InStr(1, Tall, Txt) > 0 Then Tall = Split(Tall, vbCrLf) Set Fout = .OpenTextFile(iFile, 2, True) For Each SS In Tall If InStr(1, SS, Txt) = 0 Then Fout.WriteLine SS Next Fout.Close Set Tall = Nothing '''''''''''''' MsgBox iFile j = j + 1 End If End If End If Next Set F = .GetFolder(inDir) Set SubF = F.SubFolders End With For Each Folder In SubF Call AllFold(Folder, Msk, Txt, FO, j) Next End Sub То же, но удаление строк организовано через Replace,
страшновато, надо аккуратно написать регулярку для поиска RegExp = ".*\.htm|.*\.js" Text = vbCrLf + ".*?_temp.*?" + vbCrLf BoxIn = "Z:\Box_In\temp" ' BoxIn = "temp" ' Если скрипт забросить в папку где подпапка temp ' BoxIn = Replace(WScript.ScriptFullName, WScript.ScriptName, "") + BoxIn Set Mask = CreateObject("VBScript.RegExp") Mask.Pattern = RegExp Mask.IgnoreCase = True Mask.Global = True Set RegText = CreateObject("VBScript.RegExp") RegText.Pattern =Text RegText.IgnoreCase = True RegText.Global = True j = 0 Call AllFold(BoxIn, Mask, RegText, CreateObject("Scripting.FileSystemObject"), j) MsgBox "Обработано " + CStr(j) + " файлов" Sub AllFold(inDir, Msk, Txt, FO, j) ' --------------------------------------------- With FO Set Fold = .GetFolder(inDir) Set Files = Fold.Files For Each iFile In Files ' Цикл по файлам в папке If Msk.Test(iFile.Name) Then If iFile.Size > 0 Then Set Fin = .OpenTextFile(iFile, 1, False) Tall = Fin.ReadAll Fin.Close Tall = vbCrLf + Tall + vbCrLf LL1 = Len(Tall) Tall = Txt.Replace(Tall, vbCrLf) LL2 = Len(Tall) If LL1 <> LL2 Then Set Fout = .OpenTextFile(iFile, 2, True) Fout.Write Mid(Tall, 3, LL2 - 4) Fout.Close Set Tall = Nothing '''''''''''''' MsgBox iFile j = j + 1 End If End If End If Next Set F = .GetFolder(inDir) Set SubF = F.SubFolders End With For Each Folder In SubF Call AllFold(Folder, Msk, Txt, FO, j) Next End Sub |
|
------- Последний раз редактировалось megaloman, 19-06-2019 в 19:42. Отправлено: 18:33, 19-06-2019 | #5 |
Ветеран Сообщения: 2703
|
Профиль | Отправить PM | Цитировать Цитата alpap:
CMD
@Echo Off cls Set "BoxIn=Z:\Box_In\Temp" Set "Mask="*.htm" "*.js"" Set "Text=_temp" Pushd "%BoxIn%" FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /A:-D /S %Mask%`) DO ( Echo "%%f" >nul 2>&1 Find "%Text%" "%%f" && ( >"%%f.tmp" FindStr /V "%Text%" "%%f" >nul Move /Y "%%f.tmp" "%%f" ) ) Popd Pause Exit /B Цитата Артур Блох+Мэрфи:
|
||
------- Последний раз редактировалось megaloman, 20-06-2019 в 15:02. Отправлено: 14:48, 20-06-2019 | #6 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать megaloman, если в строках будут разные выкрутасы и вдобавок неудобная кодировка, то тут и начнется то о чем я говорил иначе просто повезло.
|
Отправлено: 18:26, 20-06-2019 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Замена текста во всех файлах директории | rasinv | Скриптовые языки администрирования Windows | 0 | 27-11-2013 23:14 | |
CMD/BAT - [решено] Как удалить все файлы одного типа во всех подпапках определенной папки? | popt2t | Скриптовые языки администрирования Windows | 3 | 16-02-2013 21:03 | |
VBS/WSH/JS - [решено] Замена текста во всех файлах Word | RiskSoft | Скриптовые языки администрирования Windows | 7 | 20-04-2012 20:03 | |
VBS/WSH/JS - [решено] Нужно быстро (!) удалить пустые строки во всех txt-файлах из одной директории | andreton | Скриптовые языки администрирования Windows | 10 | 08-06-2010 03:39 |
|