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

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

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

Аватара для hunk3r

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


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

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


Всем привет.
Давно читаю форум и часто пользуюсь батниками, но ума не дам как дописать следующее:
Есть директория E:\Steam\userdata\ в ней множество др. директорий, в каждой из которых есть файл с именем sharedconfig.vdf

Мне необходимо в каждом найденном по имени "sharedconfig.vdf" файле заменить строку "cloudenabled" "1" на "cloudenabled" "0" (строка находится в рандомном месте как по вертикали файла, так и по горизонтали)
Начало простое:
Код: Выделить весь код
For /F %%i in ('"where /R E:\Steam\userdata\ "sharedconfig.vdf""') do (
Прошу, помогите закончить скрипт.

Отправлено: 18:54, 09-06-2018

 

Аватара для hunk3r

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


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

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


Проверил, работает. Еще раз всем спасибо!

Отправлено: 20:41, 09-06-2018 | #11



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

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


Ветеран


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

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


Цитата YuS_2:
в варианте на powershell, это не столь важно... »
Как это — неважно? Что возвращает командлет Get-Content? Если я понимаю правильно — массив объектов, сформированных из строк, так? И что будет, например, с концами строк в формате Unix в результате простого банального Get-Content | Set-Content? Правильно — они превратятся в концы строк в формате DOS/Windows.

Отправлено: 20:46, 09-06-2018 | #12


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
И что будет, например, с концами строк в формате Unix »
Лучше один раз увидеть, чем сто раз услышать
В приложенном файле, как раз, конец строк в формате Unix...
Протестируйте вышеприведенный скрипт...

Цитата Iska:
Правильно — они превратятся в концы строк в формате DOS/Windows. »
Это утверждение? Зачем тогда были вопросы?
Цитата Iska:
Если я понимаю правильно — массив объектов, сформированных из строк, так? »
В данном случае, не так...

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


Отправлено: 20:52, 09-06-2018 | #13


Ветеран


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

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


Цитата YuS_2:
Лучше один раз увидеть, чем сто раз услышать
В приложенном файле, как раз, конец строк в формате Unix...
Протестируйте вышеприведенный скрипт... »
YuS_2, приношу свои извинения, просмотрел параметр -raw.


Наблюдаю забавный побочный эффект — в файл добавляется пустая строка с концом строки в формате DOS/Windows.

И файл в оригинале был без BOM.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:07, 09-06-2018 | #14


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Наблюдаю забавный побочный эффект — в файл добавляется пустая строка с концом строки в формате DOS/Windows.
И файл в оригинале был без BOM. »
Это да, есть такой момент...
Способ сохранения без bom есть, но если это некритично, то и смысла это делать особого нет...
Что касается лишней строки... ну, это ведь микрософт, с ним без веселья никак...
Можно, конечно, оттримить текст, лишней строки не будет, но конечным символом массива текста, все же будет \r\n, от этого избавиться непросто..

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


Отправлено: 21:32, 09-06-2018 | #15


Ветеран


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

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


Цитата YuS_2:
Способ сохранения без bom есть, но если это некритично, то и смысла это делать особого нет... »
Зато так будет правильно. Знать бы ещё, что файл и в оригинале (а не тот, который был нам предоставлен) был без BOM .

Отправлено: 21:45, 09-06-2018 | #16


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Зато так будет правильно »
Правильно - категория относительная...
Самый "простой" вариант : разворачиваем параллельно существующему - PoSh Core (они не мешают друг другу), вот в нем уже есть возможность UTF8NoBOM... т.е. этот же скрипт будет в нем работать, останется только исправить кодировку на нужную.
Ну, или по-старинке:
Код: Выделить весь код
$utf8nobom = new-object system.text.utf8encoding($false)
dir "E:\Steam\userdata\" -rec -inc 'sharedconfig.vdf'|%{
    $arr = ((gc $_.fullname -enc utf8 -raw) -replace '(?<="cloudenabled"\s*")1(?=")','0').trim()
    [io.file]::writealllines($_.fullname, $arr, $utf8nobom)
}

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


Последний раз редактировалось YuS_2, 09-06-2018 в 22:46.


Отправлено: 22:15, 09-06-2018 | #17


Ветеран


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

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


Цитата YuS_2:
Ну, или по-старинке: »
Тогда уж целиком делать:
Код: Выделить весь код
$UTF8Encoding = New-Object -TypeName 'System.Text.UTF8Encoding' -ArgumentList $false
$sContent = [System.IO.File]::ReadAllText('C:\Мои проекты\0163\sharedconfig.vdf', $UTF8Encoding) -replace '(?<="cloudenabled"\s*")1(?=")','0'
[System.IO.File]::WriteAllText('C:\Мои проекты\0163\sharedconfig2.vdf', $sContent, $UTF8Encoding)
и нет проблем ни с кодировкой, ни с концами строк.

Вот за то я PowerShell и не люблю: хоть уже и напоминает отожравшегося монстра, но кучу простых и естественных вещей по-прежнему не умеет нормально делать, и выясняется, что старые дедовские способы программирования всё ещё работают надёжнее.

Отправлено: 01:13, 10-06-2018 | #18


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
и нет проблем ни с кодировкой, ни с концами строк. »
Можно и так, только организовать ещё рекурсивный отбор файлов... для цельности решения
Код: Выделить весь код
$utf8nobom = new-object system.text.utf8encoding($false)
dir "E:\Steam\userdata\" -rec -inc 'sharedconfig.vdf'|%{
    $arr = ([io.file]::readalltext($_.fullname, $utf8nobom)) -replace '(?<="cloudenabled"\s*")1(?=")','0'
    [io.file]::writealllines($_.fullname, $arr, $utf8nobom)
}
и конечный \r\n, всё равно, никуда не денется... ведь gc -raw, делает то же самое...
Цитата Iska:
Вот за то я PowerShell и не люблю: хоть уже и напоминает отожравшегося монстра, но кучу простых и естественных вещей по-прежнему не умеет нормально делать »
Имхо, так вроде не шибко-то и монстр, а то, что умеет многое - это плюс большой, да и способов решения задач у него множество (не работает так - решаем по-другому), в общем, на любой вкус и привычку... в том числе и dotnet хорошо пережевывает...
Во всяком случае, это уже далеко не ограниченный cmd...
К тому же, сейчас это открытый проект, развивается себе постепенно...

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


Последний раз редактировалось YuS_2, 10-06-2018 в 09:38.


Отправлено: 08:14, 10-06-2018 | #19


Ветеран


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

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


Монстр, монстр . Командлеты и так уже перегружены всяческими параметрами (и, что самое печальное, многочисленными умолчаниями) по самое нехочу, причём картина, зачастую, складывается удручающая. Поначалу куча вещей банально оставалась за бортом, добавляясь только после многочисленных пинков со стороны пользователей через одну-две версии, и то не сразу, и через пень-колоду. Одни и те же сущности в разных командлетах могли быть тупо реализованы отличным образом. Какая-нибудь никому не нужная хрень могла появиться ещё в первой версии, а такие банальные и необходимые для администрирования вещи, как отправка почты по защищённому протоколу, работа с архивами, работа с ftp, работа с альтернативными потоками данных, получали свои командлеты спустя долгое, долгое время.

Я бы лично предпочёл какой-нибудь интерпретатор для .Net по аналогу с WSH на основе той же сладкой парочки VB/JS.

Отправлено: 08:42, 10-06-2018 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Можно ли найти файлы созданные за сегодняшний день и дать отчет о них ufooo Скриптовые языки администрирования Windows 12 20-04-2016 01:49
CMD/BAT - Найти в подкаталогах файлы по маске и вывести в текст список тех, у которых первые 2 surgutfred Скриптовые языки администрирования Windows 2 27-01-2016 19:07
CMD/BAT - [решено] Отделить слово от строки по маске blackeangel Скриптовые языки администрирования Windows 2 11-11-2015 23:07
VBS/WSH/JS - [решено] Поиск строки по маске в txt файле и замена всей строки из InputBox ultrarare Скриптовые языки администрирования Windows 11 03-07-2013 14:37
CMD/BAT - [решено] Нужно найти все файлы *.log в папке dir и подпапках и заменить на файлы нулевой длины dclxvi Скриптовые языки администрирования Windows 4 04-07-2012 21:28




 
Переход