Показать полную графическую версию : [решено] Изменение текста в файле
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) Только для файлов
и т.д.
Вот только не знаю как.
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
Где это можно посмотреть в стандартном описание, я что-то такого не нахожу.
здесь наверное просто опечатка? »"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 - > полные. Для меня загадка.
Вот хоть убейте не разберусь :(
Я может не там смотрю (или не так :) ), но не нахожу информации :(
"!$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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.