假设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
输出很完美......但我需要克服的问题是将数据附加到保存文件而不是覆盖...
答案 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
部分,因为我认为没有必要。