2017-02-02 13 views
0

Я работаю над сценарием PowerShell для PowerShell v3 в системе Server 2012 R2, чтобы рекурсивно искать указанные папки в исходном пути и копировать файлы wav менее 5 минут в целевой каталог.Рекурсивный поиск и копирование PowerShell

В этом примере кода я бы нужно \\ источник \ путь \ Folder1 и \\ Источник \ путь \ folder2 для поиска в WAV файлы, а затем попросите их скопировать в корневой каталог назначения \\ назначения \ путь

Я пытался настроить запланированную задачу, чтобы запускать ее каждые 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 
       } 

ответ

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 
             } 
           } 
+0

Для моей цели, которая не будет работать, поскольку файл wav, который копируется в этот каталог, будет перемещен снова в папку архива, как только файл будет сопоставлен с XML и загружен в службу диктовки. Использование CreationTime - хорошая идея, так как wav-файлы не будут редактироваться после его создания. –

0

Причины этот код не делает ничего, что вы фильтрацию на вторую линии, здесь:

Where-Object {$_.PSIsContainer}  

Вы фильтрация только для каталогов, а не только для файлов , Поскольку вы не позже в рекурсии кода через папки, вот почему ничего не происходит.

Я хотел бы удалить это заявление и указать -Include *.wav на вашем начальном Get-ChildItem cmd.

+0

Причина для строки «Where-Object {$ _. PSIsContainer}» заключалась в том, чтобы только отталкивать поиск «folder1» и «folder2», отмеченный выше. Разве я не создал Array $ FolderName для этого? –

0

Как FoxDeploy упомянуто и короткий тест подтвердил это не проблема:

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

Я советую вам лучше использовать несколько путей вместо фильтрации имен папок, так что вы можете попробовать follwing, чтобы получить свои волны:

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

И им немного интересно, почему $ Src = «\ источник \ путь» не начинается с точки. В моем случае все испытания прошли без сбоев.

Я думаю, вы хотите добавить контекст в свой файл журнала, поэтому добавьте: -noclubber -append в Outfile.