Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

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

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить 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
Благодарности: 564

Профиль | Отправить PM | Цитировать


Цитата BerryMOR:
и удалить строки, в которых он встречается »
вы, вероятно, даже не представляете насколько непросто это для cmd. Такую задачу лучше решать на подходящем для этого языке.
еще может быть что я неправильно понимаю задачу или напротив, вы неправильно ее формулируете, возможно условие должно звучать так:
Найти все файлы ... в имени которых встречается "_temp" и переименовать их, вырезав искомое сочетание. Но в таком случае надо предусмотреть как поступить в случае совпадения имен после вырезания искомой вставки.

Последний раз редактировалось alpap, 19-06-2019 в 08:54.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:45, 19-06-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Не представлял, когда начинал это делать. Сейчас уже представляю. Задача мной сформулирована корректно.
Но надеялся, что может найдется гуру, кто предложит решение. Я искал-искал, но не смог.
Если нет, то наверное сделаю консольку на с# каком-нибудь.
Жаль конечно потраченного времени. Но что ж поделаешь, если изначально не смог правильно оценить возможности инструментария.
Будет наука.

Отправлено: 11:07, 19-06-2019 | #3


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1167
Благодарности: 486

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Отправлено: 18:05, 19-06-2019 | #4


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить 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


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


Цитата alpap:
вы, вероятно, даже не представляете насколько непросто это для cmd »
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
Благодарности: 564

Профиль | Отправить PM | Цитировать


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

Отправлено: 18:26, 20-06-2019 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Удалить строку с ключевым набором символов во всех файлах в папке и всех подпапках.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход