Компьютерный форум 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=147668)

tarasov.evgeny 11-08-2009 11:57 1190865

Изменение текста в файле
 
Добрый день.
Есть компьютер, на котором расположены общие папки по отделам. Есть необходимость регулярно готовить отчеты об изменениях в правах на папки, т.е. кто получил доступ до какой папки.
Что есть и работает.
Есть файл spisok.txt - в котором перечислены названия папок
Код:

folder1
folder2
folder3
...
foldern

И есть bat-файл, вот с такими содержимым(z:\ - это сетевой диск, где расположены папки, а длинный путь это путь до моего компа. out - папка, рядом с bat-файлом):
Код:

for /f %%a in (spisok.txt) do cacls z:\%%a >> "c:\documents and settings\user\desktop\cacls\%%a.LOG"
xcopy /z /i *.log out
del  *.log
cd out
find /i "DOMAIN" *.log  >> spisok_all_folder.txt

На выходе получаем текстовый файл spisok_all_folder.txt с таким содержанием:
Код:

---------- FOLDER1.LOG
z:\FOLDER1 DOMAIN\USER1:F
      DOMAIN\USER2:(OI)(CI)F

---------- FOLDER2.LOG
              DOMAIN\USER1:(OI)(CI)C
              DOMAIN\USER2:(OI)(CI)C

Хочется заменить в тексте
F - полные
OI - Для этой папки и ее файлов
CI - Для этой папки и ее подпапок
(IO)(CI) Для этой папки, ее подпапок и файлов
(OI)(CI)(IO) Только для подпапок и файлов
(CI)(IO) Только для подпапок
(OI)(IO) Только для файлов
и т.д.
Вот только не знаю как.

amel27 11-08-2009 14:48 1191029

tarasov.evgeny, как вариант обработки файла spisok_all_folder.txt:
Код:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set $LOG=spisok_all_folder.txt

Set F=Полные
Set C=Изменение
Set W=Запись
Set R=Чтение
Set N=Отсутствие

Set OICI=Для этой папки, ее подпапок и файлов
Set CI=Для этой папки и ее подпапок
Set OI=Для этой папки и ее файлов
Set OICIIO=Только для подпапок и файлов
Set CIIO=Только для подпапок
Set OIIO=Только для файлов

For /F "UseBackQ Delims=" %%i In ("%$LOG%") Do (
  Set $LINE=%%i

  If Not "---"=="!$LINE:~0,3!" (
      Set $RGHT=%%!$LINE:~-2,1!%%
      Set $LINE=!$LINE:~0,-2!

      Set $LINE=!$LINE:^)(=!
      Set $LINE=!$LINE:^(= %%!
      Set $LINE=!$LINE:^)=%%! [!$RGHT!]

  ) Else Echo.
  CALL Echo !$LINE!
)

P.S. Но это только для стандартных прав!

tarasov.evgeny 11-08-2009 17:23 1191187

Помогите разобрать по строчкам:

SetLocal EnableExtensions EnableDelayedExpansion - здесь наверное просто опечатка? S - не нужна. Вы включаете всё возможности командной строки.

вот здесь темный лес.
Код:

For /F "UseBackQ Delims=" %%i In ("%$LOG%") Do (
  Set $LINE=%%i

Вы разбираете файл spisok_all_folder.txt по строчкам и каждую строчку запихиваете в переменную $line?
А затем ещё страшнее :)
Код:

If Not "---"=="!$LINE:~0,3!" (
      Set $RGHT=%%!$LINE:~-2,1!%%
      Set $LINE=!$LINE:~0,-2!

      Set $LINE=!$LINE:^)(=!
      Set $LINE=!$LINE:^(= %%!
      Set $LINE=!$LINE:^)=%%! [!$RGHT!]

  ) Else Echo.
  CALL Echo !$LINE!

Если в переменной есть три тире '---' то задаются две переменные
set $RGHT и переменной LINE дается новое значение?
Что значить знак !
Что значить :~0,2
Где это можно посмотреть в стандартном описание, я что-то такого не нахожу.

amel27 12-08-2009 06:29 1191613

Цитата:

Цитата tarasov.evgeny
здесь наверное просто опечатка? »

"SetLocal /?"
Цитата:

Цитата tarasov.evgeny
разбираете файл spisok_all_folder.txt по строчкам и каждую строчку запихиваете в переменную $line? »

именно так ("FOR /?") :)
Цитата:

Цитата tarasov.evgeny
Если в переменной есть три тире '---' »

наоборот - если нет (If Not) - "IF /?"
Цитата:

Цитата tarasov.evgeny
Что значить знак ! »

"CMD /?"
Цитата:

Цитата tarasov.evgeny
Что значить :~0,2 »

"SET /?"
Цитата:

Цитата tarasov.evgeny
Где это можно посмотреть в стандартном описание »

вроде уже ответил... ;)

tarasov.evgeny 12-08-2009 15:59 1191967

Я прошу прощения за назойливость, но я не могу найти описание вот таких частей как:
Код:

:~0,2
или
Код:

:~-2,1!
Вот что это значит. Если в строке нет трех тире то, мы как-то разбираем строчку:
Код:

If Not "---"=="!$LINE:~0,3!" (
      Set $RGHT=%%!$LINE:~-2,1!%%
      Set $LINE=!$LINE:~0,-2!

Объясните хотя бы на примере [!$RIGHT]
Из команды if мне понятно, что мы пропускаем строчку с тире и разбираем другие строки.
Причем мы берем не всю строку а с какими-то атрибутами - !:~0,3! и добавляем две переменные. Одна из них задает права [!$RIGHT].
Опять же не понятно, почему два %, что такое !, и т.д.
Вроде как бы одно подставляется в другое и так три раза, но например каким макаром в строку попадает перменная в который задано, что F - > полные. Для меня загадка.
Вот хоть убейте не разберусь :(
Я может не там смотрю (или не так :) ), но не нахожу информации :(

amel27 12-08-2009 16:21 1191988

"!$LINE:~-2,1!" - возвращает предпоследний символ "$LINE"
"!$LINE:~0,-2!" - возвращает "$LINE" без последних двух символов

цитата из справки ("SET /?"):
Цитата:

Можно также использовать строки расширения.

%PATH:~10,5%

расширит действие переменной среды PATH, затем использует только 5
символов, которые начинаются с 11-го символа (пропустив 10) расширенного
результата. Если длина не указана, по умолчанию используется оставшееся
значение переменной. Если оба значения (длина и число пропускаемых символов)
отрицательны, следующим используемым значением будет длина значения переменной
среды, добавленной к указанному значению пропуска или указанной длины.

%PATH:~-10%

извлечет последние 10 символов переменной PATH.

%PATH:~0,-2%

извлечет все символы переменной PATH, за исключением 2-х последних.
Аналогично и по остальному (не хочу воспроизводить справку)... кроме того, глянь линки:

CMD/BAT - [решено] Раскрытие имени файла во вложеном For
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной.


Время: 02:04.

Время: 02:04.
© OSzone.net 2001-2025