Назад | Перейти на главную страницу

пакетный файл бесконечный цикл при разборе файла

РЕДАКТИРОВАТЬ: По-видимому, у меня недостаточно репутации, чтобы ответить на мой собственный вопрос, поэтому ответ здесь.

ЛАДНО!

ТАК! Я не совсем решить проблема ... но я перестал использовать 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 услужливо спрашивает "вы уверены?" для каждого каталога в списке.

К сожалению, однако, то, что он ДЕЛАЕТ, попадает в бесконечный цикл. Я пробовал заключать все после «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
}

Можно было бы использовать гораздо больше 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