2015-07-24 1 views
0

Я надеялся, что кто-то может помочь мне с этим скриптом, который в настоящее время озадачивает меня, я не очень хорошо;) PowerShellКопировать Wav файлы старше 3-х месяцев до архива, создавая год месяц путей

Что Я пытаюсь создать сценарий, который будет сканировать папки и подпапки моего источника, ища файлы * .wav старше 60 дней, а затем переместить их в место назначения архива, создав структуру папок \ year \ month

Это то, что у меня есть

$SourceDir = "d:\test" 
$DestinationDir = "e:\test" 
$files = get-childitem $SourceDir *.wav 
foreach ($file in $files) 
{ 
$Directory = $DestinationDir + "" + $file.CreationTime.Date.ToString('yyyy') + "\" + $file.CreationTime.Date.ToString('MM-MMM') 
if (!(Test-Path $Directory)) 
{ 
New-Item $directory -type directory 
} 
where-object {$_.LastWriteTime -lt (get-date).AddDays(-61)} | move-item $file.fullname $Directory 
} 

Сценарий запускается без ошибок, но не перемещает файлы:/

-

Исходя из комментариев Keiths ниже, мой сценарий выглядит так:

$SourceDir = "d:\test\" 
$DestinationDir = "e:\test\" 
$date = (get-date).AddDays(-91) 
$files = get-childitem -literalpath $SourceDir *.wav 
foreach ($file in $files) 
{ 
$Directory = $DestinationDir + "" + $file.CreationTime.Date.ToString('yyyy') + "\" + $file.CreationTime.Date.ToString('MM-MMM') 
if (!(Test-Path $Directory)) 
{ 
New-Item $directory -type directory 
} 
if ($file.LastWriteTime -lt $date) { 
    Write-Host $file 
    move-item -LiteralPath $file.fullname -Destination $Directory 
} 
} 

И работает отлично! Спасибо Keith

ответ

0

Где-объект никогда не находится в начале трубопровода. Он требует ввода для заполнения переменной $_, которую вы обычно используете для сравнения. Замените эту строку с:

if ($file.LastWriteTime -lt (get-date).AddMonths(-3)) { 
    move-item $file.fullname $Directory 
} 

Хотя я бы вычислить дату за пределами цикла:

$date = (get-date).AddMonths(-3) 

И использовать что внутри цикла:

... 
if ($file.LastWriteTime -lt $date) { 
    Move-Item -LiteralPath $file.fullname -Destination $Directory 
} 
... 
+0

Шаг в правильном направлении! Вы, конечно, правы, я сделал модификацию, и теперь скрипт создает структуру папок, но не удается перенести файлы (у меня есть файлы более 6 месяцев). – user3612344

+0

Попробуйте обновленный ответ (используя -LiteralPath), чтобы сделать уверен, что он работает с именем файла со специальными символами типа '[]'. Если это все еще не работает, поместите это выше Move-Item - 'Write-Host $ file', чтобы убедиться, что' if' test действительно находит старые файлы. Кстати, ваш вопрос говорит 3 месяца, но ваш тест составляет 61 день, что составляет ~ 2 месяца? –

+0

Привет Кит, надеюсь, у вас были хорошие выходные;). На этот раз совет следовал правильно, очень устал в пятницу, и я вижу, что это потому, что тест if не находит файлы. Типичное имя файла: «[Boardroom] _3000-6% 2A% 2A7_20150723135940 (259088) .wav» - обновил приведенный выше сценарий. – user3612344

Смежные вопросы