Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск и замена строки в определенной папке и ее подпапках. (http://forum.oszone.net/showthread.php?t=328342)

Zhenyok21 14-07-2017 14:36 2751377

Поиск и замена строки в определенной папке и ее подпапках.
 
]Имеется некая папка, в ней, возможно, находится файл "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 2751383

Цитата:

Цитата Zhenyok21
находится файл "SH.INI" в котором обязательно содержится строка SIZE_LOG_FILE_KB=512 и куча других строк. »

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

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

Busla 15-07-2017 11:21 2751547

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 2751744

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

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

если
Код:

@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 2751905

Цитата:

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

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

Zhenyok21 17-07-2017 08:42 2751908

Вложений: 1
Цитата:

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

Вот файлик. Аналогичных файлов с таким же названием в подпапках каталога уйма.

Iska 17-07-2017 11:13 2751942

Цитата:

Цитата Zhenyok21
А проблема с удалением пустых строк с чем связана? »

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

Цитата:

Цитата Zhenyok21
Решить ее возможно? »

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

$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
}



Время: 23:26.

Время: 23:26.
© OSzone.net 2001-