Windows

解析文件時批處理文件無限循環

  • April 3, 2012

編輯:顯然我沒有足夠的代表來回答我自己的問題,所以答案就在這裡。

好的!

所以!我並沒有完全解決問題……但我停止使用 cacls.exe 並開始使用 icacls.exe 現在它似乎又可以工作了。

批處理文件現在如下所示:

FOR /F "tokens=*" %%A IN (dirlist.txt) DO echo y| icacls "%%A" /T /C /Grant "Domain Admins":f "Some Group":f "some-security-group":f

顯然, cacls 在 2k8 中已貶值,並且不再像您期望的那樣執行…

無論如何,我可能正在研究 Mathieu 的 powershell 解決方案,因為這可能需要在未來再次完成,而且他的方式似乎更乾淨。

謝謝大家的幫助!


好的,這應該是一個非常簡單的任務,但事實證明它比我想像的要復雜。我顯然做錯了什麼,並希望得到其他人的意見。

我想做的是解析包含目錄路徑的文件並設置這些目錄的權限。

輸入文件的範例行。有幾行,格式相同,目錄路徑不同。

E:\stuff\Things\something else (X)\

(有問題的文件是在 Cygwin 下生成的,使用 find 列出名稱中帶有“(X)”的所有目錄。然後通過 unix2win 傳遞該文件以使其與 Windows 兼容。我還嘗試從內部手動創建輸入文件windows排除文件的創建方法是問題。)

這就是我卡住的地方……我在 Windows XP 中編寫了以下快速而骯髒的批處理文件,它完全沒有任何問題,但它在伺服器 2k8 中不起作用。

執行文件並設置權限的批處理文件程式碼:

FOR /F "tokens=*" %%A IN (dirlist.txt) DO echo y| cacls "%%A" /T /C /G "Domain Admins":f "Some Group":f "some-security-group":f

這是應該做的(並且在 XP 中做的)是遍歷指定的文件(dirlist.txt)並在它從文件中提取的每個目錄上執行 cacls.exe。“迴聲 y|” 當 cacls 有用地詢問“你確定嗎?”時,它會自動確認嗎?對於列表中的每個目錄。

然而不幸的是,它所做的是陷入了一個無限循環。我試過用引號括住“DO”之後的所有內容,這可以防止無限循環但會混淆 cacls 所以它會引發錯誤。

有趣的是,我嘗試在命令提示符下手動執行“DO”之後的程式碼(顯然用完整路徑替換變數,直接從文件中複製)並按預期執行。我不認為它是文件或循環,因為在要執行的命令中添加引號會阻止循環繼續超過它應該的位置……我現在真的不知道。任何幫助,將不勝感激。我有一種感覺,這將是一件非常愚蠢的事情……但我正在拔頭髮,所以我想我會問。

你會接受使用 powershell 嗎?它可以完成整個工作,甚至可以避免 cygwin 部分。

第一種方法是通過powershell進行循環:

$dirlist=Get-Content dirlist.txt
foreach ($dir in $dirlist)
{
   write-output "doing $dir"
   echo y | cacls "$dir" /T /C /G "Domain Admins":f "Some Group":f "some-security-group":f
}

將通過使用它來更改 ACL 來利用更多的 powershell:

$dirlist=Get-Content dirlist.txt
foreach ($dir in $dirlist)
{
 write-output "doing $dir"
 $acl=(get-item $dir).GetAccessControl()
 $colRights = [System.Security.AccessControl.FileSystemRights]::FullControl
 $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None
 $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
 $objType =[System.Security.AccessControl.AccessControlType]::Allow 
 $objUser = New-Object System.Security.Principal.NTAccount("wingroup\kenmyer") 
 $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType) 
 $acl.AddAccessRule($objACE)
}

更多細節可以在這裡找到:http ://technet.microsoft.com/en-us/library/ff730951.aspx

引用自:https://serverfault.com/questions/376355