2014-01-28 3 views
0

시스템의 모든 고정 디스크에서 모든 디렉토리 (개별 파일 아님)의 권한을 가져 오도록 배치 스크립트를 만듭니다. 다음은 작동하는 방식입니다. 로컬로 고정 된 모든 NTFS 파티션을 나열하는 임시 파일을 만들 수 있습니다. 그 임시 파일 (일반적으로 C : 드라이브)에서 첫 줄을 가져 와서 dir 명령과 그것에 대한 icacls/cacls 명령을 실행할 수 있습니다. 내가 가지고있는 문제는 임시 파일에 나열된 다른 드라이브에 대해 dir 명령과 icacls/cacls 명령을 실행하기 위해 다시 순환되지 않는다는 것입니다. 어떤 도움을 주시면 감사하겠습니다.첫 번째 변수를 실행 한 후 배치 파일의 중첩 for 루프가 닫습니다.

wmic logicaldisk get caption, drivetype, filesystem | find "3" | find "NTFS" | find /v "Caption" > "tmp_drives.txt" 

setlocal enableDelayedExpansion 
for /f "delims=:" %%A in (tmp_drives.txt) do (

    dir %%A:\ /ad /s /b >> "%%A_dir.txt" 

    set drive=%%A 

    if exist "%systemroot%\system32\icacls.exe" goto icacls 

    for /f "tokens=* usebackq" %%J in ("!drive!_dir.txt") do cacls "%%J" | find /v "GENERIC_READ" | find /v "GENERIC_EXECUTE" >> "!drive!_Permissions.txt" 
    goto end 

    :icacls 
    for /f "tokens=* usebackq" %%J in ("!drive!_dir.txt") do icacls "%%J" | find /i /v "Successfully" >> "!drive!_Permissions.txt" 

    :end 
) 
setlocal disableDelayedExpansion 
del tmp_drives.txt 
pause 

답변

0
wmic logicaldisk get caption, drivetype, filesystem | find "3" | find "NTFS" | find /v "Caption" > "tmp_drives.txt" 

setlocal enableDelayedExpansion 
for /f "delims=:" %%A in (tmp_drives.txt) do (

dir %%A:\ /ad /s /b >> "%%A_dir.txt" 

set drive=%%A 
if exist "%systemroot%\system32\icacls.exe" (
    for /f "tokens=* usebackq" %%J in ("!drive!_dir.txt") do icacls "%%J" | find /i /v "Successfully" >> "!drive!_Permissions.txt" 
) else (
    for /f "tokens=* usebackq" %%J in ("!drive!_dir.txt") do cacls "%%J" | find /v "GENERIC_READ" | find /v "GENERIC_EXECUTE" >> "!drive!_Permissions.txt" 
) 
) 
setlocal disableDelayedExpansion 
del tmp_drives.txt 
pause 

내가 그렇게 코드 블록 내 레이블을 싫어하는 : 여기 내 스크립트입니다. 일부 판에서는 블록을 작동시키지 않고 종료한다고 생각합니다. 이것을 시도해보십시오. 원본의 편집 버전이지만 라벨은 붙이지 않았습니다.

+0

그건 속임수 였어! 고맙습니다. 나는 그것이 레이블과 관련이 있지만 그것을 사용하지 않고 스크립트를 작성하는 방법을 모르겠다는 몰래 의심했다. 다시 한번 감사드립니다. – user3245583