Показать полную графическую версию : Найти файлы по маске и заменить в них строки
Всем привет.
Давно читаю форум и часто пользуюсь батниками, но ума не дам как дописать следующее:
Есть директория E:\Steam\userdata\ в ней множество др. директорий, в каждой из которых есть файл с именем sharedconfig.vdf
Мне необходимо в каждом найденном по имени "sharedconfig.vdf" файле заменить строку "cloudenabled" "1" на "cloudenabled" "0" (строка находится в рандомном месте как по вертикали файла, так и по горизонтали)
Начало простое:
For /F %%i in ('"where /R E:\Steam\userdata\ "sharedconfig.vdf""') do (
Прошу, помогите закончить скрипт.
megaloman
09-06-2018, 19:05
hunk3r, Хотелось бы потрогать файл руками - упакуйте пожалуйста и предоставьте.
Есть директория E:\Steam\userdata\ в ней множество др. директорий, в каждой из которых есть файл с именем sharedconfig.vdf
Мне необходимо в каждом найденном по имени "sharedconfig.vdf" файле заменить строку "cloudenabled" "1" на "cloudenabled" "0" (строка находится в рандомном месте как по вертикали файла, так и по горизонтали) »
В какой кодировке файлы?
powershell
script.ps1
dir "E:\Steam\userdata\" -rec -inc 'sharedconfig.vdf'|%{
(gc $_.fullname -enc utf8 -raw) -replace '(?<=\"cloudenabled\"\s*\")1(?=\")','0'|`
set-content $_.fullname -enc utf8
}
для запуска:
run.bat
@echo off
echo Выполняем...
powershell -ex bypass .\script.ps1
echo Готово.
pause
Кодировка 1251 как я понял.
https://pp.userapi.com/c824601/v824601417/160536/0X9yyfr44Qw.jpg
В какой кодировке файлы? »
Потому и требуем упаковать в архив и приложить. И кроме кодировки, там ещё может быть существенной такая радость механика, как тип конца строки (в трёх ипостасях).
Кодировка 1251 как я понял. »
hunk3r, вот, чтобы Вам не гадать, а пишущим не заниматься ручным набором содержимого файла — делайте то, что просят: упакуйте файл в архив и приложите к сообщению.
Кодировка 1251 как я понял. »
Так... вот выше правильно говорят - упакуйте и приложите, а там увидим :)
А пока, по Вашим данным, скрипт выше поправил...
как тип конца строки (в трёх ипостасях) »
в варианте на powershell, это не столь важно...
Прошу прощения, торопился) Вот.
торопился »
Спешить не надо :)
Кодировка там UTF8.
Вернул кодировку в скрипте...
s* »
Спасибо!)
Если я правильно понимаю, то \s*\ между кавычками - это любое количество пробелов?
это любое количество пробелов? »
это ноль или более пробельных символов, а не только пробелов...
Проверил, работает. Еще раз всем спасибо!
в варианте на powershell, это не столь важно... »
Как это — неважно? Что возвращает командлет Get-Content? Если я понимаю правильно — массив объектов, сформированных из строк, так? И что будет, например, с концами строк в формате Unix в результате простого банального Get-Content | Set-Content? Правильно — они превратятся в концы строк в формате DOS/Windows.
И что будет, например, с концами строк в формате Unix »
Лучше один раз увидеть, чем сто раз услышать :)
В приложенном файле, как раз, конец строк в формате Unix...
Протестируйте вышеприведенный скрипт...
Правильно — они превратятся в концы строк в формате DOS/Windows. »
Это утверждение? Зачем тогда были вопросы? :)
Если я понимаю правильно — массив объектов, сформированных из строк, так? »
В данном случае, не так...
Лучше один раз увидеть, чем сто раз услышать
В приложенном файле, как раз, конец строк в формате Unix...
Протестируйте вышеприведенный скрипт... »
YuS_2, приношу свои извинения, просмотрел параметр -raw.
Наблюдаю забавный побочный эффект — в файл добавляется пустая строка с концом строки в формате DOS/Windows.
И файл в оригинале был без BOM.
Наблюдаю забавный побочный эффект — в файл добавляется пустая строка с концом строки в формате DOS/Windows.
И файл в оригинале был без BOM. »
Это да, есть такой момент...
Способ сохранения без bom есть, но если это некритично, то и смысла это делать особого нет...
Что касается лишней строки... ну, это ведь микрософт, с ним без веселья никак...
Можно, конечно, оттримить текст, лишней строки не будет, но конечным символом массива текста, все же будет \r\n, от этого избавиться непросто..
Способ сохранения без bom есть, но если это некритично, то и смысла это делать особого нет... »
Зато так будет правильно. Знать бы ещё, что файл и в оригинале (а не тот, который был нам предоставлен) был без BOM ;).
Зато так будет правильно »
Правильно - категория относительная... :)
Самый "простой" вариант :) : разворачиваем параллельно существующему - 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)
}
Ну, или по-старинке: »
Тогда уж целиком делать:
$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 и не люблю: хоть уже и напоминает отожравшегося монстра, но кучу простых и естественных вещей по-прежнему не умеет нормально делать, и выясняется, что старые дедовские способы программирования всё ещё работают надёжнее.
и нет проблем ни с кодировкой, ни с концами строк. »
Можно и так, только организовать ещё рекурсивный отбор файлов... для цельности решения :)
$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, делает то же самое...
Вот за то я PowerShell и не люблю: хоть уже и напоминает отожравшегося монстра, но кучу простых и естественных вещей по-прежнему не умеет нормально делать »
Имхо, так вроде не шибко-то и монстр, а то, что умеет многое - это плюс большой, да и способов решения задач у него множество (не работает так - решаем по-другому), в общем, на любой вкус и привычку... в том числе и dotnet хорошо пережевывает...
Во всяком случае, это уже далеко не ограниченный cmd...
К тому же, сейчас это открытый проект, развивается себе постепенно...
Монстр, монстр ;). Командлеты и так уже перегружены всяческими параметрами (и, что самое печальное, многочисленными умолчаниями) по самое нехочу, причём картина, зачастую, складывается удручающая. Поначалу куча вещей банально оставалась за бортом, добавляясь только после многочисленных пинков со стороны пользователей через одну-две версии, и то не сразу, и через пень-колоду. Одни и те же сущности в разных командлетах могли быть тупо реализованы отличным образом. Какая-нибудь никому не нужная хрень могла появиться ещё в первой версии, а такие банальные и необходимые для администрирования вещи, как отправка почты по защищённому протоколу, работа с архивами, работа с ftp, работа с альтернативными потоками данных, получали свои командлеты спустя долгое, долгое время.
Я бы лично предпочёл какой-нибудь интерпретатор для .Net по аналогу с WSH на основе той же сладкой парочки VB/JS.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.