Проблема Robocopy с файлами *.txt

EDITED: У меня есть конкретная проблема с robocopy в PowerShell.
Весь мой код выглядит так:

$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, но это тоже не сработало. Есть идеи, что случилось?


person dmnmlk    schedule 23.07.2015    source источник
comment
Вы используете параметр -Name для Get-ChildItem. Это означает, что возвращаются только имена (string, а не FileInfo). string не имеет свойства CreationTime.   -  person user4003407    schedule 23.07.2015
comment
спасибо за ответ, но без '-Name' нет никакой разницы. Это все еще не работает   -  person dmnmlk    schedule 23.07.2015


Ответы (1)


В вашем коде возникают ошибки, потому что $yesterdayFiles содержит FileInfo объектов, которые расширяются до их полного пути при использовании в операторе robocopy. Однако robocopy синтаксис

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

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

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

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

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

$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
  }
person Ansgar Wiechers    schedule 23.07.2015
comment
спасибо за огромную помощь, теперь я знаю свою ошибку. Ваше здоровье! - person dmnmlk; 23.07.2015