PDA

Показать полную графическую версию : [решено] Изменение текста в файле


tarasov.evgeny
11-08-2009, 11:57
Добрый день.
Есть компьютер, на котором расположены общие папки по отделам. Есть необходимость регулярно готовить отчеты об изменениях в правах на папки, т.е. кто получил доступ до какой папки.
Что есть и работает.
Есть файл 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
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
Помогите разобрать по строчкам:

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
здесь наверное просто опечатка? »"SetLocal /?"
разбираете файл spisok_all_folder.txt по строчкам и каждую строчку запихиваете в переменную $line? »именно так ("FOR /?") :)
Если в переменной есть три тире '---' »наоборот - если нет (If Not) - "IF /?"
Что значить знак ! »"CMD /?"
Что значить :~0,2 »"SET /?"
Где это можно посмотреть в стандартном описание »вроде уже ответил... ;)

tarasov.evgeny
12-08-2009, 15:59
Я прошу прощения за назойливость, но я не могу найти описание вот таких частей как:

:~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
"!$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 (http://forum.oszone.net/showthread.php?t=145014&highlight=%F6%E8%EA%EB%2A)
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной. (http://forum.oszone.net/thread-144548.html)




© OSzone.net 2001-2012