1

假设 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

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

4

2 回答 2

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将 ACL 保存在使用 UTF-16 little-endian 编码的文件中——其中会有大量空字节。

于 2017-02-09T14:05:40.077 回答
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部分,因为我认为没有必要。

于 2017-02-17T21:08:34.517 回答