Войти

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


Страниц : [1] 2

hunk3r
09-06-2018, 18:54
Всем привет.
Давно читаю форум и часто пользуюсь батниками, но ума не дам как дописать следующее:
Есть директория 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, Хотелось бы потрогать файл руками - упакуйте пожалуйста и предоставьте.

YuS_2
09-06-2018, 19:56
Есть директория 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

hunk3r
09-06-2018, 20:01
Кодировка 1251 как я понял.
https://pp.userapi.com/c824601/v824601417/160536/0X9yyfr44Qw.jpg

Iska
09-06-2018, 20:06
В какой кодировке файлы? »
Потому и требуем упаковать в архив и приложить. И кроме кодировки, там ещё может быть существенной такая радость механика, как тип конца строки (в трёх ипостасях).

Кодировка 1251 как я понял. »
hunk3r, вот, чтобы Вам не гадать, а пишущим не заниматься ручным набором содержимого файла — делайте то, что просят: упакуйте файл в архив и приложите к сообщению.

YuS_2
09-06-2018, 20:12
Кодировка 1251 как я понял. »
Так... вот выше правильно говорят - упакуйте и приложите, а там увидим :)
А пока, по Вашим данным, скрипт выше поправил...

как тип конца строки (в трёх ипостасях) »
в варианте на powershell, это не столь важно...

hunk3r
09-06-2018, 20:18
Прошу прощения, торопился) Вот.

YuS_2
09-06-2018, 20:27
торопился »
Спешить не надо :)
Кодировка там UTF8.
Вернул кодировку в скрипте...

hunk3r
09-06-2018, 20:31
s* »
Спасибо!)
Если я правильно понимаю, то \s*\ между кавычками - это любое количество пробелов?

YuS_2
09-06-2018, 20:34
это любое количество пробелов? »
это ноль или более пробельных символов, а не только пробелов...

hunk3r
09-06-2018, 20:41
Проверил, работает. Еще раз всем спасибо!

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

YuS_2
09-06-2018, 20:52
И что будет, например, с концами строк в формате Unix »
Лучше один раз увидеть, чем сто раз услышать :)
В приложенном файле, как раз, конец строк в формате Unix...
Протестируйте вышеприведенный скрипт...

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

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

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

И файл в оригинале был без BOM.

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

Iska
09-06-2018, 21:45
Способ сохранения без bom есть, но если это некритично, то и смысла это делать особого нет... »
Зато так будет правильно. Знать бы ещё, что файл и в оригинале (а не тот, который был нам предоставлен) был без BOM ;).

YuS_2
09-06-2018, 22:15
Зато так будет правильно »
Правильно - категория относительная... :)
Самый "простой" вариант :) : разворачиваем параллельно существующему - 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)
}

Iska
10-06-2018, 01:13
Ну, или по-старинке: »
Тогда уж целиком делать:
$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 и не люблю: хоть уже и напоминает отожравшегося монстра, но кучу простых и естественных вещей по-прежнему не умеет нормально делать, и выясняется, что старые дедовские способы программирования всё ещё работают надёжнее.

YuS_2
10-06-2018, 08:14
и нет проблем ни с кодировкой, ни с концами строк. »
Можно и так, только организовать ещё рекурсивный отбор файлов... для цельности решения :)
$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...
К тому же, сейчас это открытый проект, развивается себе постепенно...

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

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




© OSzone.net 2001-2012