Имя пользователя:
Пароль:
 | Правила  

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

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

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


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

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


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

Отправлено: 14:36, 14-07-2017

 

Ветеран


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

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


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

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

Отправлено: 14:57, 14-07-2017 | #2



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

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


Ветеран


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

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


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
(если использовать команду внутри батника, нужно писать %%, а не % перед переменной)

Отправлено: 11:21, 15-07-2017 | #3


Ветеран


Contributor


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

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


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"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 16-07-2017 в 14:15.


Отправлено: 13:17, 16-07-2017 | #4


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


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

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


Цитата megaloman:
Или, ИМХО, быстрее работает так »
Так работает отлично. А проблема с удалением пустых строк с чем связана? Решить ее возможно?

Отправлено: 08:40, 17-07-2017 | #5


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


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

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


Вложения
Тип файла: rar SH.rar
(805 байт, 7 просмотров)

Цитата Iska:
Упакуйте файл в архив и приложите к сообщению. »
Вот файлик. Аналогичных файлов с таким же названием в подпапках каталога уйма.

Отправлено: 08:42, 17-07-2017 | #6


Ветеран


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

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


Цитата 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
}

Отправлено: 11:13, 17-07-2017 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Копирование файлов в папке и ее подпапках которые не старше 5минут gremlintv2 Скриптовые языки администрирования Windows 1 30-03-2016 14:30
CMD/BAT - Поиск и замена строки в txt файлах по содержанию этой строки. sayyad Скриптовые языки администрирования Windows 1 06-12-2015 13:20
VBS/WSH/JS - [решено] Поиск строки по маске в txt файле и замена всей строки из InputBox ultrarare Скриптовые языки администрирования Windows 11 03-07-2013 14:37
CMD/BAT - [решено] Список файлов в папке и ее подпапках popt2t Скриптовые языки администрирования Windows 9 19-02-2013 00:14
VBS/WSH/JS - [решено] Замена определенной строки в скрипте vbs neo21 Скриптовые языки администрирования Windows 0 28-10-2011 13:30




 
Переход