Показать полную графическую версию : скрипт для замены текста в файле
есть каталог с папками(профилями почты 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
а потом вернуть как было.
"Туда":
@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
.
Georgio, по рабоче-крестьянски ;)? И, кстати, самое верное при с заведомо известным содержанием »
Georgio,
almazova_iv будет меняться
т.е. это имя пользователя кому принадлежит профиль, практически почти всегда имя папки(имя профиля) соответствует
этой строчке
т.е. строку в файле вида
Path=\\S680000FILE\MAIL\%переменная%
нужно сменить на Path=\\S680000FILE3\MAIL\%переменная%
и вообще отлично бы, если в скрипт внести переменную взамен S680000FILE и S680000FILE3
что сменив значение переменной менять все профили одним скриптом.
Э… зачем? »
перенос планирую, около 2тб профилей, с минимальной потерей по времени простоя пользователей
almazova_iv будет меняться »
Тогда выражайтесь точнее. Потому как:
с заведомо известным содержанием: »
я понял именно так. Полагаю, и коллега Georgio — тоже.
хотя для меня в конкретной задаче вполне удовлетворил просто поиск значения в файле и его замена
S680000FILE на S680000FILE3
Iska, пардон, я имел ввиду что содержание нам известно, но с некоторыми изменчивыми переменными
хотел просто для наглядности выложить содержимое.
@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
Georgio,
не к almazova_iv не надо привязываться
вместо данного пользователя может быть что угодно.
изменять требуется только S680000FILE на S680000FILE3 и подобное ну S680000FILE1 или S680000FILE2
@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
не корректно отработал
получилось
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
и рекурсия где то ломается, т.е. скрипт не отрабатывает все папки, только первых несколько
не корректно отработал »
Не надо было удалять комментарий из кода!
рекурсия где то ломается, т.е. скрипт не отрабатывает все папки, только первых несколько »
Продолжу разработку только тогда, когда распакую архив с Вашей папкой, выложенный на RGhost.
Не надо было удалять комментарий из кода! »
не удалял.
Продолжу разработку только тогда, когда распакую архив с Вашей папкой, выложенный на RGhost. »
все 2тб данных не реально выложить, я выложил для наглядности папку mail и входящие в неё профили, профили очистил.
может что бы скрипт работал быстрее и не спотыкался на чём то (например кириллицу в именах папок или файлов) рекурсию ограничить вхождением до одного.
да, и тут пока проверял оказалось что некоторые профили настроены по ip
т.е. часть строки с ip нужно заменить по аналогии с именем
т.е. 10.11.60.16 на допустим 10.11.60.228
http://rghost.ru/59192373
например кириллицу в именах папок или файлов »
В выложенном примере нет кириллицы.
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
[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
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, читайте Правила: «Один вопрос — одна тема», а не «Один участник — одна тема».
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.