将保存的ICACLS设置附加到文件循环中

时间:2017-02-09 13:12:23

标签: batch-file cmd icacls

假设C:\ temp \ listoffolders.txt

中的文件或文件夹列表
for /f eol^=^"^ delims^=^" %a in (C:\temp\listoffolders.txt) do cmd.exe /c icacls "%a" /save C:\temp\listoffolders.txt\iCACLSBackup.txt

输出很完美......但我需要克服的问题是将数据附加到保存文件而不是覆盖...

2 个答案:

答案 0 :(得分:0)

使用复合命令将ACL保存到临时文件中,并将临时文件附加到合并文件中:

@echo off
::
:: Reads pathnames from the file listoffiles.txt and saves the
:: corresponding ACLs in listofacls.txt
::
set TEMPFILE=tmp%RANDOM%-%RANDOM%.txt
if exist listofacls.txt del listofacls.txt
for /f "delims="" eol=""" %%f in (listoffiles.txt) do (
  echo "%%f"
  icacls "%%f" /save %TEMPFILE% >nul
  type %TEMPFILE% >>listofacls.txt
)
del %TEMPFILE%

(这是一个粗略的准备好的脚本。在生产中你需要添加一些错误检查,将临时文件放在%TEMP%中,等等。)

如何处理合并文件是另一个问题。请注意icacls使用UTF-16 little-endian编码将ACL保存在文件中 - 那里会有大量的空字节。

答案 1 :(得分:0)

让命令行写入临时文件(例如C:\temp\iCACLSBackup.tmp),然后使用以下内容将内容附加到最终目标文件(C:\temp\iCACLSBackup.txt):

copy /Y /B "C:\temp\iCACLSBackup.txt"+"C:\temp\iCACLSBackup.tmp" "C:\temp\iCACLSBackup.txt"

之后清理临时文件:

del "C:\temp\iCACLSBackup.tmp"

即使在一个命令行中也可以使用所有这些:

(for /F usebackq^ eol^=^"^ delims^=^" %a in ("C:\temp\listoffolders.txt") do icacls "%~a" /SAVE "C:\temp\iCACLSBackup.tmp") && copy /Y /B "C:\temp\iCACLSBackup.txt"+"C:\temp\iCACLSBackup.tmp" "C:\temp\iCACLSBackup.txt" && del "C:\temp\iCACLSBackup.tmp"

&&运算符仅在前一个命令成功的情况下执行以下命令,即退出代码为零时。

我省略了cmd /C部分,因为我认为没有必要。