CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Ответить
 • Просмотры: 1
Аватара пользователя
BerryMOR

CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Сообщение BerryMOR »

Здравствуйте, очень нужна помощь в решении следующей задачи!



Есть папка .\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"
  )
)
Аватара пользователя
alpap

Re: CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Сообщение alpap »

Цитата BerryMOR:



и удалить строки, в которых он встречается
CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.




вы, вероятно, даже не представляете насколько непросто это для cmd. Такую задачу лучше решать на подходящем для этого языке.

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

Найти все файлы ... в имени которых встречается "_temp" и переименовать их, вырезав искомое сочетание. Но в таком случае надо предусмотреть как поступить в случае совпадения имен после вырезания искомой вставки.
Аватара пользователя
BerryMOR

Re: CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Сообщение BerryMOR »

Не представлял, когда начинал это делать. Сейчас уже представляю. Задача мной сформулирована корректно.

Но надеялся, что может найдется гуру, кто предложит решение. Я искал-искал, но не смог.

Если нет, то наверное сделаю консольку на с# каком-нибудь.

Жаль конечно потраченного времени. Но что ж поделаешь, если изначально не смог правильно оценить возможности инструментария.

Будет наука.
Аватара пользователя
YuS_2

Re: CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Сообщение YuS_2 »

Цитата BerryMOR:



искал-искал, но не смог.
CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.




не там искали. Надо было в powershell посмотреть, для него это вполне просто. Если устроит - решение можно и подсказать.
Аватара пользователя
megaloman

Re: CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Сообщение megaloman »

BerryMOR,


Если задача Вами сформулирована корректно и мной правильно понята, то вот vbs

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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,

страшновато, надо аккуратно написать регулярку для поиска

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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

Re: CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Сообщение megaloman »

Цитата alpap:



вы, вероятно, даже не представляете насколько непросто это для cmd
CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.







CMD

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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






Цитата Артур Блох+Мэрфи:



Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.
CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.




В зависимости от символов в файлах, скрипт то ли отработает корректно, то ли нет. Зато просто.
Аватара пользователя
alpap

Re: CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Сообщение alpap »

megaloman, если в строках будут разные выкрутасы и вдобавок неудобная кодировка, то тут и начнется то о чем я говорил иначе просто повезло.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»