我需要监控文件夹及其子目录中的文件修改。我需要具体了解发生了哪些修改。
想到这个问题,我想监控的文件就必须有一个副本,以便在检测到修改时进行比较。
如果已经有好的工具可以做到这一点,我宁愿不自己实现它。我在初始搜索中找到的工具只会提醒更改,而不会显示前后差异。
答案1
Robocopy
与特定参数一起使用仅列表源位置中不同的文件将被复制到目标位置。
您正在监控的已被修改的文件,使用此包裹Robocopy
在 PowerShell 代码中的代码块根据需要预先创建目标副本。
1. 将源复制到目标
$SRC = "C:\Source\Folder"
$DEST = "C:\Destination\Folder"
$FName = "*.*"
$OPT = "/S /R:5 /NS /NC /NDL /FP /NJH /NJS"
$CMD = "robocopy $SRC $FName $DEST $OPT"
Invoke-Expression $CMD
Robocopy
然后,您可以使用PowerShell 包装的此代码块来列出已修改的任何源位置文件的完整路径与目标位置的不匹配。
2. 列出源更改的文件
$SRC = "C:\Source\Folder"
$DEST = "C:\Destination\Folder"
$FName = "*.*"
$OPT = "/S /R:5 /NS /NC /NDL /FP /NJH /NJS /L"
$CMD = "robocopy $SRC $FName $DEST $OPT"
$v = Invoke-Expression $CMD
$v.Trim() | % { $_ };
第二个块的输出将仅列出已修改的文件。这不会重新复制文件。将此输出放入不同的格式或记录只是一件小事。
您可以根据需要随时重新运行第一个块,以根据您的工作流程将任何修改后的文件实际复制到目标位置。
示例输出
C:\Src\MP\List.txt
C:\Src\MP\Archive\Dance\Cool.mp3
C:\Src\MP\Archive\Dance\Too Cool.mp3
C:\Src\MP\Archive\Dance\Way Too Cool.mp3
C:\Src\MP\Archive\Dance\Silly So Cool.mp3
C:\Src\MP\Archive\Dance\Too Fool For School.mp3
C:\Src\MP\Archive\Dance\Nerd School Cool.mp3
C:\Src\MP\Dance\Cool.mp3
C:\Src\MP\Dance\Too Cool.mp3
C:\Src\MP\Dance\Way Too Cool.mp3
C:\Src\MP\Dance\Silly So Cool.mp3
不同的变化
这是使用 PowerShell 的此逻辑的另一种变体,它将运行Robocopy
以仅列出已修改的文件。它将评估所调用命令的结果Robocopy
,并仅列出它发现的已更改的文件。
$SRC = "C:\Source\Folder"
$DEST = "C:\Destination\Folder"
$FName = "*.*"
$OPT = "/S /R:5 /NS /NC /NDL /FP /NJH /NJS /L"
$CMD = "robocopy $SRC $FName $DEST $OPT"
$v = Invoke-Expression $CMD;
If ($v) {
Write-Host "*** Modified files listed below ***" -ForegroundColor Magenta;
$v.Trim() | % {
Write-Host $_ -ForegroundColor Yellow;};
};
支持资源
-
- Robocopy
Robocopy /?
/S :: copy Subdirectories, but not empty ones. /L :: List only - don't copy, timestamp or delete any files. /FP :: include Full Pathname of files in the output. /NS :: No Size - don't log file sizes. /NC :: No Class - don't log file classes. /NDL :: No Directory List - don't log directory names. /NJH :: No Job Header. /NJS :: No Job Summary.
- 调用表达式
- ForEach 对象
标准别名对于 Foreach 对象:'
%
' 符号,ForEach - 修剪()
默认情况下
trim()
将删除前导和尾随空格以及前导和尾随换行符。