2015-07-23 3 views
1

EDITED: У меня есть специальная проблема с robocopy в PowerShell.
Мой весь код выглядит следующим образом:Проблема с копией с * .txt файлами

$yesterday = (Get-Date).AddDays(-1).Date.ToShortDateString() 
$ifExistFilesToCopy = (Get-ChildItem *.txt | Where-Object {$_.CreationTime.Date -le $yesterday}) 
IF ($ifExistFilesToCopy) { 
    $i=1 
    DO { 
     $yesterdayDay = ((Get-Date).AddDays(-$i).Date.ToShortDateString()) 
     $yesterdayFiles = (Get-ChildItem *.txt | Where-Object {$_.CreationTime.Date -eq $yesterdayDay}) 
     IF ($yesterdayFiles) { 
      & robocopy $PSScriptRoot "$PSScriptRoot\$yesterdayDay" $yesterdayFiles /copyall 
     } 
     $i++ 
    } WHILE (!($yesterdayFiles -contains (Get-ChildItem *.txt | Sort CreationTime | select -First 1))) 
} 
pause 

Моя главная проблема: Когда я ставлю *.txt после Get-ChildItem, robocopy не копирует файлы .txt, потому что это дает результат назад, как $yesterdayFiles = '' в то время как эта переменная содержит информацию об этом файлы, и я уверен в этом.

Без *.txt после Get-ChildItem весь скрипт отлично подходит для меня: он копирует файлы в разные папки, и все работает отлично.

Как я сказал ранее, он падает только тогда, когда я пытаюсь указать расширение файла.

У меня есть 2 файла с 21 июля (file1.txt, file2.txt) и 1 файл с 21 апреля (file3.txt), все в C: \, и есть ошибка, которая появляется в моей консоли:

ОШИБКА! недопустимый параметр # 3: C: \ file1.txt

и после того, что другой:

ОШИБКА! недопустимый параметр # 3: C: \ file3.txt

Я попытался с помощью Get-ChildItem –Include *.txt, а также я попытался дать *.txt в качестве параметра robocopy, но он не работает, как хорошо. Любая идея, что не так?

+1

Вы используете параметр '-Name' для' Get-ChildItem'. Это означает только имена возвратов ('string' not' FileInfo'). 'string' не имеет свойства' CreationTime'. – PetSerAl

+0

спасибо за ответ, но без '-Name' нет никакой разницы. Он все еще не работает – dmnmlk

ответ

1

Исправлены ошибки в коде, поскольку $yesterdayFiles содержит FileInfo объекты, которые расширяются до полного пути при использовании в инструкции robocopy. robocopy syntax, однако, является

robocopy <Source> <Destination> [<File>[ ...]] [<Options>] 

, где <File> представляет собой имя файла или шаблон для имени файла (без пути).

Кроме того, я думаю, что логика в вашем while состоянии немного ... неортодоксальная. Несмотря на то,

!($yesterdayFiles -contains (Get-ChildItem *.txt | Sort CreationTime | select -First 1)) 

должен завершить цикл после того, как в данный момент обрабатываются группа файлов содержит самый старый файл в каталоге, вы можете получить лучшие результаты (и лучше ремонтопригодность) с более шикарным подходом, как это:

$src = $PSScriptRoot 
$fmt = 'yyyy-MM-dd' 

$yesterday = (Get-Date).AddDays(-1).Date 

Get-ChildItem *.txt | 
    Where-Object { $_.CreationTime.Date -le $yesterday } | 
    Group-Object { $_.CreationTime.Date.ToString($fmt) } | 
    Sort-Object Name | 
    ForEach-Object { 
    $dst = Join-Path $PSScriptRoot $_.Name 
    $files = $_.Group | Select-Object -Expand Name 
    & robocopy $src $dst $files /copyall 
    } 
+0

спасибо за огромную помощь, теперь я знаю свою ошибку. Ура! – dmnmlk

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