PowerShell递归搜索和文件复制

时间:2017-02-02 19:17:54

标签: powershell recursion scripting get-childitem

我正在为Server 2012 R2系统上的PowerShell v3编写PowerShell脚本,以递归方式搜索源路径中的指定文件夹,并将小于5分钟的wav文件复制到目标目录。

在这个示例代码中,我需要在\\ source \ path \ folder1和\\ source \ path \ folder2中搜索wav文件,然后将它们复制到根目标目录\\ destination \ path

我试图设置一个计划任务,每5分钟运行一次,因此尝试使用{$_.LastWriteTime -gt (Get-Date).AddMinutes(-5)}的原因 没有成功。关于如何防止重复复制的任何其他建议都会很棒。

然后,我希望脚本附加到文件的日志文件中,以便将来参考,并使用名为当前日期的日志文件。

任何建议都将不胜感激。

$Dst = '\\destination\path'
$Src = '\\source\path'
$LogFolder = "\\log\path"
$FolderName = "folder1","folder2"
$FileType = '*.wav'

Get-ChildItem -Path $Src -Filter $FolderName -Recurse -Force |
        Where-Object {$_.PSIsContainer} |
        Where-Object {$_.LastWriteTime -gt (Get-Date).AddMinutes(-5)} |
                ForEach-Object {
                    Copy-Item -Path (Join-Path -Path $_.FullName -ChildPath '\*') -Filter $FileType -Destination $Dst -Force | Out-File $LogFolder $(get-date -f MM-dd-YYYY) + .log
                }

3 个答案:

答案 0 :(得分:0)

您可以在复制前添加测试路径检查,以防止同时抓取同一文件两次。 CreationTime是否比LastWriteTime更好?

$Dst = '\\destination\path'
$Src = '\\source\path'
$LogFolder = "\\log\path"
$FolderName = "folder1","folder2"
$FileType = '*.wav'

Get-ChildItem -Path $Src -Filter $FolderName -Recurse -Force |
        Where-Object {$_.PSIsContainer} |
        Where-Object {$_.LastWriteTime -gt (Get-Date).AddMinutes(-5)} |
                ForEach-Object {
                                if (Test-Path "$Dst\$_.FullName" -eq 0)
                                       {
                                       Copy-Item -Path (Join-Path -Path $_.FullName -ChildPath '\*') -Filter $FileType -Destination $Dst -Force | Out-File $LogFolder $(get-date -f MM-dd-YYYY) + .log
                                       }
                               }

答案 1 :(得分:0)

这段代码没有做任何事情的原因是你要在第二行过滤,在这里:

Where-Object {$_.PSIsContainer} 

您只是过滤目录,而不仅仅是文件。由于您不会在代码中稍后通过文件夹进行递归,因此没有任何事情发生。

我会删除该语句,并在您的初始-Include *.wav cmd上指定Get-ChildItem

答案 2 :(得分:0)

正如FoxDeploy所提到的并且一个简短的测试确认,这不是问题:

{$_.LastWriteTime -gt (Get-Date).AddMinutes(-5)}

我建议您更好地使用多个路径而不是过滤文件夹名称,以便您可以尝试以下方式来获取您的信息:

Get-ChildItem -Path $paths -Filter "*.wav" -File -Recurse -Force

我有点想知道为什么 $ Src ='\ source \ path'不以点开头。在我的情况下,所有试验相处并没有失败。

我想你想在你的日志文件中添加上下文,所以将 -noclubber -append 添加到Outfile。