Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   скрипт для замены текста в файле (http://forum.oszone.net/showthread.php?t=291316)

batyaPS 20-11-2014 13:14 2432513

скрипт для замены текста в файле
 
есть каталог с папками(профилями почты 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 2432558

Э… зачем?

Georgio 20-11-2014 14:39 2432559

"Туда":


Код:

@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 2432577

Georgio, по рабоче-крестьянски ;)? И, кстати, самое верное при
Цитата:

Цитата batyaPS
с заведомо известным содержанием »


batyaPS 20-11-2014 15:12 2432583

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

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

Цитата:

Цитата Iska
Э… зачем? »

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

Iska 20-11-2014 15:20 2432593

Цитата:

Цитата batyaPS
almazova_iv будет меняться »

Тогда выражайтесь точнее. Потому как:
Цитата:

Цитата batyaPS
с заведомо известным содержанием: »

я понял именно так. Полагаю, и коллега Georgio — тоже.

batyaPS 20-11-2014 15:21 2432595

хотя для меня в конкретной задаче вполне удовлетворил просто поиск значения в файле и его замена
S680000FILE на S680000FILE3

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

Georgio 20-11-2014 17:34 2432700

Код:

@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 2433106

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

Georgio 21-11-2014 13:22 2433166

Код:

@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 2433210

не корректно отработал
получилось
Цитата:

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 2433234

Цитата:

Цитата batyaPS
не корректно отработал »

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


Цитата:

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

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

batyaPS 21-11-2014 23:59 2433548

Цитата:

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

не удалял.

Цитата:

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

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

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

http://rghost.ru/59192373

Iska 22-11-2014 00:42 2433560

Цитата:

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

В выложенном примере нет кириллицы.

Foreigner 22-11-2014 11:50 2433634

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 2433683

Цитата:

Цитата batyaPS (из скрытого текста)
Код:



[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, просто уберите из кода пустую строку после "######################".




Цитата:

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


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




Цитата:

Цитата batyaPS
да, и тут пока проверял оказалось что некоторые профили настроены по 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 2434548

Georgio, работает
спасибо

Цитата:

Цитата Foreigner
$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 2434753

Цитата:

Цитата batyaPS
$env:C:\1\MAIL »

Просто C:\1\Mail
В моем примере была системная переменная userprofile, я к ней обратился через "диск" переменных env:
Код:

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


batyaPS 09-01-2015 23:29 2453973

раз уж такое дело - а подскажите читабельную на выходе команду которая выведет по всем папкам в папке без рекурсии права ? т.е. запустив в папке что бы выдала какие права у вложенных в данную папку имеются .

Iska 10-01-2015 06:27 2454024

Цитата:

Цитата batyaPS
раз уж такое дело - а подскажите »

batyaPS, читайте Правила: «Один вопрос — одна тема», а не «Один участник — одна тема».


Время: 06:19.

Время: 06:19.
© OSzone.net 2001-