解析文件时批处理文件无限循环

解析文件时批处理文件无限循环

编辑:显然我没有足够的代表来回答我自己的问题,所以答案就在这里。

好的!

所以!我并没有解决问题...但是我停止使用 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。当 cacls 针对列表中的每个目录询问“您确定吗?”时,其中的“echo y|”会自动确认。

但不幸的是,它确实陷入了无限循环。我尝试过用引号将“DO”后面的所有内容括起来,这可以防止无限循环,但会使 cacls 感到困惑,因此会引发错误。

有趣的是,我尝试在命令提示符下手动运行“DO”之后的代码(显然是用从文件中直接复制的完整路径替换变量),它按预期运行。我不认为这是文件或循环的问题,因为在要执行的命令中添加引号会阻止循环继续执行到它应该执行的位置...我现在真的不知道。任何帮助都将不胜感激。我有一种感觉,这将是一件非常愚蠢的事情...但我抓狂了,所以我想问一下。

答案1

你会接受使用 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
}

通过使用 Powershell 来更改 ACL,可以利用更多功能:

$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

相关内容