Войти

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


batyaPS
20-11-2014, 13:14
есть каталог с папками(профилями почты Mozilla Thunderbird)
в каждой папке данного каталога есть некий заведомо известный файл(profiles.ini)
с заведомо известным содержанием:

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=\\S680000FILE\MAIL\almazova_iv


требуется изменить рекурсивно(во всех папках данного каталога) файл profiles.ini
вот так:

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=\\S680000FILE3\MAIL\almazova_iv



а потом вернуть как было.

Iska
20-11-2014, 14:35
Э… зачем?

Georgio
20-11-2014, 14:39
"Туда":


@echo off

set "dir=D:\Test"
set "file=profiles.ini"

for /f "delims=" %%i in ('"2>nul dir /a-d/b/s "%dir%\%file%""') do<"%~f0">"%%i" more +9

exit /b
#######################################################################################

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=\\S680000FILE3\MAIL\almazova_iv


.



"Обратно":


@echo off

set "dir=D:\Test"
set "file=profiles.ini"

for /f "delims=" %%i in ('"2>nul dir /a-d/b/s "%dir%\%file%""') do<"%~f0">"%%i" more +9

exit /b
#######################################################################################

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=\\S680000FILE\MAIL\almazova_iv


.

Iska
20-11-2014, 15:01
Georgio, по рабоче-крестьянски ;)? И, кстати, самое верное при с заведомо известным содержанием »

batyaPS
20-11-2014, 15:12
Georgio,
almazova_iv будет меняться
т.е. это имя пользователя кому принадлежит профиль, практически почти всегда имя папки(имя профиля) соответствует
этой строчке
т.е. строку в файле вида
Path=\\S680000FILE\MAIL\%переменная%
нужно сменить на Path=\\S680000FILE3\MAIL\%переменная%

и вообще отлично бы, если в скрипт внести переменную взамен S680000FILE и S680000FILE3
что сменив значение переменной менять все профили одним скриптом.

Э… зачем? »
перенос планирую, около 2тб профилей, с минимальной потерей по времени простоя пользователей

Iska
20-11-2014, 15:20
almazova_iv будет меняться »
Тогда выражайтесь точнее. Потому как:
с заведомо известным содержанием: »
я понял именно так. Полагаю, и коллега Georgio — тоже.

batyaPS
20-11-2014, 15:21
хотя для меня в конкретной задаче вполне удовлетворил просто поиск значения в файле и его замена
S680000FILE на S680000FILE3

Iska, пардон, я имел ввиду что содержание нам известно, но с некоторыми изменчивыми переменными
хотел просто для наглядности выложить содержимое.

Georgio
20-11-2014, 17:34
@echo off

set "dir=D:\Test"
set "file=profiles.ini"
set "var=almazova_iv"

:: Если нужно изменить строку, то "act=3".
:: Если нужно "отозвать" изменение, то "act=".
set act=

for /f "delims=" %%i in ('"findstr /eilmsc:"%var%" "%dir%\%file%""') do<"%~f0">"%%i" more +14&<nul>>"%%i" (set /p="Path=\\S680000FILE%act%\MAIL\%var%"& echo.)

exit /b
######################

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0

batyaPS
21-11-2014, 11:46
Georgio,
не к almazova_iv не надо привязываться
вместо данного пользователя может быть что угодно.
изменять требуется только S680000FILE на S680000FILE3 и подобное ну S680000FILE1 или S680000FILE2

Georgio
21-11-2014, 13:22
@echo off

set "dir=D:\Test"
set "file=profiles.ini"

:: Если нужно изменить строку, то "act=3".
:: Если нужно "отозвать" изменение, то "act=".
set act=

for /f "tokens=1,2,3 delims=:" %%i in ('findstr /bisc:"Path=\\\\S680000FILE" "%dir%\%file%"') do for /f "tokens=4 delims=\" %%l in ("%%k") do<"%~f0">"%%i:%%j" more +13&<nul>>"%%i:%%j" (set /p="Path=\\S680000FILE%act%\MAIL\%%l"& echo.)

exit /b
######################

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0

batyaPS
21-11-2014, 14:45
не корректно отработал
получилось

StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=\\S680000FILE3\MAIL\shlikov_snE



а должно было быть

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=\\S680000FILE3\MAIL\shlikov_sn


и рекурсия где то ломается, т.е. скрипт не отрабатывает все папки, только первых несколько

Georgio
21-11-2014, 15:33
не корректно отработал »

Не надо было удалять комментарий из кода!


рекурсия где то ломается, т.е. скрипт не отрабатывает все папки, только первых несколько »

Продолжу разработку только тогда, когда распакую архив с Вашей папкой, выложенный на RGhost.

batyaPS
21-11-2014, 23:59
Не надо было удалять комментарий из кода! »
не удалял.

Продолжу разработку только тогда, когда распакую архив с Вашей папкой, выложенный на RGhost. »
все 2тб данных не реально выложить, я выложил для наглядности папку mail и входящие в неё профили, профили очистил.
может что бы скрипт работал быстрее и не спотыкался на чём то (например кириллицу в именах папок или файлов) рекурсию ограничить вхождением до одного.

да, и тут пока проверял оказалось что некоторые профили настроены по ip
т.е. часть строки с ip нужно заменить по аналогии с именем
т.е. 10.11.60.16 на допустим 10.11.60.228

http://rghost.ru/59192373

Iska
22-11-2014, 00:42
например кириллицу в именах папок или файлов »
В выложенном примере нет кириллицы.

Foreigner
22-11-2014, 11:50
batyaPS,

$maildir = "$env:userprofile\mail" # Полный путь к папке MAIL

gci $maildir profiles.ini -recurse | % {

(gc $_.fullname) -replace "S680000FILE","S680000FILE3" -replace '\d*\.\d*\.\d*\.\d*','10.11.60.228' | sc $_.fullname -encoding default

}
На PowerShell

Georgio
22-11-2014, 14:20
[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=\\S680000FILE\MAIL\almazova_iv »



В реальных файлах:

[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0
Path=\\S680000FILE\MAIL\almazova_iv

.

Отсюда и отсутствие первой строки.
batyaPS, просто уберите из кода пустую строку после "######################".




например кириллицу в именах папок или файлов »


Данному коду кириллица в именах папок не страшна, а кириллические имена файлов и вовсе к нему не имеют отношеия, так как имена всех обрабатывемых файлов-- "profiles.ini".




да, и тут пока проверял оказалось что некоторые профили настроены по ip
т.е. часть строки с ip нужно заменить по аналогии с именем
т.е. 10.11.60.16 на допустим 10.11.60.228 »


@echo off

set "dir=D:\Work\583\MAIL"
set "file=profiles.ini"

:: Если нужно изменить строку, то "act=3".
:: Если нужно "отозвать" изменение, то "act=".
set act=

for /f "delims=" %%i in ('
"2>nul dir /a-d/b/s "%dir%\%file%""
') do (
for /f "tokens=2,4 delims=\" %%j in ('
findstr /rc:"^Path=\\\\" "%%i"
') do (
>"%%i" (
<"%~f0" more +41
<nul (
set /p=Path=\\
if defined act (
if "%%j"=="S680000FILE" (
set /p=S680000FILE%act%
) else (
set /p=10.11.60.228
)
) else (
if "%%j"=="S680000FILE3" (
set /p=S680000FILE
) else (
set /p=10.11.60.16
)
)
set /p=\MAIL\%%k
)
)
)
)

exit /b

######################
[General]
StartWithLastProfile=1

[Profile0]
Name=default
IsRelative=0

batyaPS
24-11-2014, 11:10
Georgio, работает
спасибо

$m »
Foreigner, с повером что то не сложилось кучу ошибок высыпал

PS C:\WINDOWS\system32\WindowsPowerShell\v1.0> $maildir = "$env:C:\1\MAIL" # Полный путь к папке MAIL

gci $maildir profiles.ini -recurse | % {

(gc $_.fullname) -replace "S680000FILE","S680000FILE3" -replace '\d*\.\d*\.\d*\.\d*','10.11.60.228' | sc $_.fullname -encoding default

}
Set-Content : Не удается привязать параметр "Encoding". Не удается преобразовать значение "default" в тип "Microsoft.PowerShell
.Commands.FileSystemCmdletProviderEncoding" из-за недопустимых значений перечисления. Укажите одно из следующих значений перечи
сления и повторите попытку. Возможны следующие значения перечисления: "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8,
UTF7, Ascii".
строка:5 знак:131
+ (gc $_.fullname) -replace "S680000FILE","S680000FILE3" -replace '\d*\.\d*\.\d*\.\d*','10.11.60.228' | sc $_.fullname -enc
oding <<<< default
+ CategoryInfo : InvalidArgument: (:) [Set-Content], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SetContentCommand

Set-Content : Не удается привязать параметр "Encoding". Не удается преобразовать значение "default" в тип "Microsoft.PowerShell
.Commands.FileSystemCmdletProviderEncoding" из-за недопустимых значений перечисления. Укажите одно из следующих значений перечи
сления и повторите попытку. Возможны следующие значения перечисления: "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8,
UTF7, Ascii".
строка:5 знак:131
+ (gc $_.fullname) -replace "S680000FILE","S680000FILE3" -replace '\d*\.\d*\.\d*\.\d*','10.11.60.228' | sc $_.fullname -enc
oding <<<< default
+ CategoryInfo : InvalidArgument: (:) [Set-Content], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SetContentCommand

Set-Content : Не удается привязать параметр "Encoding". Не удается преобразовать значение "default" в тип "Microsoft.PowerShell
.Commands.FileSystemCmdletProviderEncoding" из-за недопустимых значений перечисления. Укажите одно из следующих значений перечи
сления и повторите попытку. Возможны следующие значения перечисления: "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8,
UTF7, Ascii".
строка:5 знак:131
+ (gc $_.fullname) -replace "S680000FILE","S680000FILE3" -replace '\d*\.\d*\.\d*\.\d*','10.11.60.228' | sc $_.fullname -enc
oding <<<< default
+ CategoryInfo : InvalidArgument: (:) [Set-Content], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SetContentCommand

Set-Content : Не удается привязать параметр "Encoding". Не удается преобразовать значение "default" в тип "Microsoft.PowerShell
.Commands.FileSystemCmdletProviderEncoding" из-за недопустимых значений перечисления. Укажите одно из следующих значений перечи
сления и повторите попытку. Возможны следующие значения перечисления: "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8,
UTF7, Ascii".
строка:5 знак:131
+ (gc $_.fullname) -replace "S680000FILE","S680000FILE3" -replace '\d*\.\d*\.\d*\.\d*','10.11.60.228' | sc $_.fullname -enc
oding <<<< default
+ CategoryInfo : InvalidArgument: (:) [Set-Content], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SetContentCommand

Set-Content : Не удается привязать параметр "Encoding". Не удается преобразовать значение "default" в тип "Microsoft.PowerShell
.Commands.FileSystemCmdletProviderEncoding" из-за недопустимых значений перечисления. Укажите одно из следующих значений перечи
сления и повторите попытку. Возможны следующие значения перечисления: "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8,
UTF7, Ascii".
строка:5 знак:131
+ (gc $_.fullname) -replace "S680000FILE","S680000FILE3" -replace '\d*\.\d*\.\d*\.\d*','10.11.60.228' | sc $_.fullname -enc
oding <<<< default
+ CategoryInfo : InvalidArgument: (:) [Set-Content], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SetContentCommand

Set-Content : Не удается привязать параметр "Encoding". Не удается преобразовать значение "default" в тип "Microsoft.PowerShell
.Commands.FileSystemCmdletProviderEncoding" из-за недопустимых значений перечисления. Укажите одно из следующих значений перечи
сления и повторите попытку. Возможны следующие значения перечисления: "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8,
UTF7, Ascii".
строка:5 знак:131
+ (gc $_.fullname) -replace "S680000FILE","S680000FILE3" -replace '\d*\.\d*\.\d*\.\d*','10.11.60.228' | sc $_.fullname -enc
oding <<<< default
+ CategoryInfo : InvalidArgument: (:) [Set-Content], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.SetContentCommand

Foreigner
24-11-2014, 17:13
$env:C:\1\MAIL »
Просто C:\1\Mail
В моем примере была системная переменная userprofile, я к ней обратился через "диск" переменных env:

$env:userprofile
dir env: -- выведет все переменные

batyaPS
09-01-2015, 23:29
раз уж такое дело - а подскажите читабельную на выходе команду которая выведет по всем папкам в папке без рекурсии права ? т.е. запустив в папке что бы выдала какие права у вложенных в данную папку имеются .

Iska
10-01-2015, 06:27
раз уж такое дело - а подскажите »
batyaPS, читайте Правила: «Один вопрос — одна тема», а не «Один участник — одна тема».




© OSzone.net 2001-2012