PDA

Показать полную графическую версию : Поиск и замена строки в определенной папке и ее подпапках.


Zhenyok21
14-07-2017, 14:36
]Имеется некая папка, в ней, возможно, находится файл "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
14-07-2017, 14:57
находится файл "SH.INI" в котором обязательно содержится строка SIZE_LOG_FILE_KB=512 и куча других строк. »
Упакуйте файл в архив и приложите к сообщению.

PowerShell будет проще и удобнее. Он Вас устроит?

Busla
15-07-2017, 11:21
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
16-07-2017, 13:17
Zhenyok21, @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 @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
В любом из вариантов, в том числе и в Вашем, пустые и пробельные строки будут убиты.
если @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
17-07-2017, 08:40
Или, ИМХО, быстрее работает так »
Так работает отлично. А проблема с удалением пустых строк с чем связана? Решить ее возможно?

Zhenyok21
17-07-2017, 08:42
Упакуйте файл в архив и приложите к сообщению. »
Вот файлик. Аналогичных файлов с таким же названием в подпапках каталога уйма.

Iska
17-07-2017, 11:13
А проблема с удалением пустых строк с чем связана? »
С особенностями разбора строк по for /f.

Решить ее возможно? »
Возможно. Но проще это сделать на WSH или PoSH. Например:
$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
}




© OSzone.net 2001-2012