CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.

Ответить
Аватара пользователя
Zhenyok21

CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.

Сообщение Zhenyok21 »

]Имеется некая папка, в ней, возможно, находится файл "SH.INI" в котором обязательно содержится строка SIZE_LOG_FILE_KB=512 и куча других строк. Так вот, нужно найти все такие файлы "SH.INI" в конкретной папке и ее подкаталогах и заменить в них данную строку на SIZE_LOG_FILE_KB=5120.

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

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

Помогите пожалуйста, уже который день мучаюсь)



Код:

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

@echo off
set file=SH.INI
set tmpfile=MYFILE.tmp
set seek=SIZE_LOG_FILE_KB
if exist %tmpfile% del /q %tmpfile%
for /f  "delims=" %%a in (%file%) do (
  (echo %%a)|>nul find /i "%seek%="&&((echo %seek%=5120)>>%tmpfile%)
  (echo %%a)|>nul find /i "%seek%="||(echo %%a)>>%tmpfile%
)  
copy /y %tmpfile% %file% >nul
del /f /q %tmpfile% >nul
Аватара пользователя
Iska

Re: CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.

Сообщение Iska »

Цитата Zhenyok21:



находится файл "SH.INI" в котором обязательно содержится строка SIZE_LOG_FILE_KB=512 и куча других строк.
CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.




Упакуйте файл в архив и приложите к сообщению.



PowerShell будет проще и удобнее. Он Вас устроит?
Аватара пользователя
Busla

Re: CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.

Сообщение Busla »

Zhenyok21, правильно - задачу нужно разделять на простые части и решать их по-отдельности.

заменяете в своём батнике вторую строку на



Код:

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

set file=%1

теперь он задаёт новое значение в любом файле переданном в качестве параметра:



Код:

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

set_new_log_size.bat sh.ini
set_new_log_size.bat c:\sh.ini
set_new_log_size.bat catalog\sh.ini
set_new_log_size.bat source_code.c

осталось найти эти файлы и передать вашему батнику. Это обычно делают встроенной командой for:



Код:

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

for /R c:\temp %i in (sh.ini) do set_new_log_size.bat %i

(если использовать команду внутри батника, нужно писать %%, а не % перед переменной)
Аватара пользователя
megaloman

Re: CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.

Сообщение megaloman »

Zhenyok21,


Вот так

[spoiler]Код:
[/spoiler]

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

@Echo Off
cls
Set "File=SH.INI"
Set "Seek=SIZE_LOG_FILE_KB="
Set "Replace=SIZE_LOG_FILE_KB=5120"
Set "BoxIn=Z:\Box_In"
FOR /F "usebackq delims=" %%f IN (`Dir "%BoxIn%\%File%" /S /B /A:-D 2^>nul`) DO (
	Echo %%f
	>"%%f.tmp" (FOR /F "usebackq tokens=*" %%s IN (`More "%%f"`) DO (
		If Not "%%s"=="" (
			Echo %%s|FindStr.exe /B /L /I /C:"%Seek%" >nul &&Echo %Replace%|| Echo %%s
		)
	))
	Move /Y "%%f.tmp" "%%f" >nul
)
pause








Или, ИМХО, быстрее работает так

[spoiler]Код:
[/spoiler]

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

@Echo Off
cls
Set "File=SH.INI"
Set "Seek=SIZE_LOG_FILE_KB"
Set "Replace=SIZE_LOG_FILE_KB=5120"
Set "BoxIn=Z:\Box_In"
FOR /F "usebackq delims=" %%f IN (`Dir "%BoxIn%\%File%" /S /B /A:-D 2^>nul`) DO (
	Echo %%f
	>"%%f.tmp" (FOR /F "usebackq tokens=*" %%s IN (`More "%%f"`) DO (
		If Not "%%s"=="" (
			For /F "tokens=1 delims==" %%i In ("%%s") Do If /I "%%i"=="%Seek%" (Echo %Replace%) Else (Echo %%s)
		)
	))
	Move /Y "%%f.tmp" "%%f" >nul
)
pause





В любом из вариантов, в том числе и в Вашем, пустые и пробельные строки будут убиты.


Busla, для for /R ..... если файл называется, например, не "sh.ini", а "s h.ini", у меня этот номер не прошел:

[spoiler]если

Код:
[/spoiler]

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

@Echo Off
cls
Set "File=S H.INI"
Set "BoxIn=Z:\Box_In"
FOR /R "%BoxIn%" %%f IN (%File%) DO Echo %%f
pause

То получим:



Z:\Box_In\S

Z:\Box_In\H.INI

Z:\Box_In\Mail\S

Z:\Box_In\Mail\H.INI

Z:\Box_In\Mail jsdgjh\S

Z:\Box_In\Mail jsdgjh\H.INI

Z:\Box_In\Папка jsdgjh\S

Z:\Box_In\Папка jsdgjh\H.INI



если

Код:

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

FOR /R "%BoxIn%" %%f IN ("%File%") DO Echo %%f

То получим:



Z:\Box_In\"S H.INI"

Z:\Box_In\Mail\"S H.INI"

Z:\Box_In\Mail jsdgjh\"S H.INI"

Z:\Box_In\Папка jsdgjh\"S H.INI"
Аватара пользователя
Zhenyok21

Re: CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.

Сообщение Zhenyok21 »

Цитата megaloman:



Или, ИМХО, быстрее работает так
CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.




Так работает отлично. А проблема с удалением пустых строк с чем связана? Решить ее возможно?
Аватара пользователя
Zhenyok21

Re: CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.

Сообщение Zhenyok21 »

Цитата Iska:



Упакуйте файл в архив и приложите к сообщению.
CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.




Вот файлик. Аналогичных файлов с таким же названием в подпапках каталога уйма.
Вложения
SH.rar
(805 байт) 0 скачиваний
SH.rar
(805 байт) 0 скачиваний
Аватара пользователя
Iska

Re: CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.

Сообщение Iska »

Цитата Zhenyok21:



А проблема с удалением пустых строк с чем связана?
CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.




С особенностями разбора строк по for /f.




Цитата Zhenyok21:



Решить ее возможно?
CMD/BAT - Поиск и замена строки в определенной папке и ее подпапках.




Возможно. Но проще это сделать на WSH или PoSH. Например:



PowerShell

[spoiler]Код:
[/spoiler]

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

$sSourceFolder   = 'C:\Мои проекты\0100'
$sSourceFileName = 'SH.INI'
$sString4Found   = 'SIZE_LOG_FILE_KB=512'
$sString4Replace = 'SIZE_LOG_FILE_KB=5120'
if(Test-Path -Path $sSourceFolder -PathType Container) {
    Get-ChildItem -Path $sSourceFolder -Filter $sSourceFileName -File -Recurse | ForEach-Object -Process {
        $sContent = Get-Content -Path $_.FullName -Encoding Oem
        if($sContent -icontains $sString4Found) {
            Write-Host $_.FullName
            $sContent.Replace($sString4Found, $sString4Replace) | Set-Content -Path $_.FullName -Encoding Oem
        }
    }
} else {
    Write-Host "Can't find source folder $sSourceFolder." -ForegroundColor Red
}
Ответить

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