*.txt 文件的 Robocopy 问题

Robocopy issue with *.txt files

已编辑:我在 PowerShell 中遇到 robocopy 的特定问题。
我的整个代码如下所示:

$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 = '' 那样返回结果变量包含有关此文件的信息,我对此很确定。

Get-ChildItem 之后没有 *.txt 整个脚本对我来说很完美:它将文件复制到不同的文件夹并且一切正常。

正如我之前所说,它仅在我尝试指定文件扩展名时崩溃。

我有 2 个 7 月 21 日的文件(file1.txt、file2.txt)和 1 个 4 月 21 日的文件(file3.txt),都在 C:\ 中,并且有一个错误出现在我的控制台中:

ERROR! invalid parameter #3: C:\file1.txt

然后是另一个:

ERROR! invalid parameter #3: C:\file3.txt

我尝试使用 Get-ChildItem –Include *.txt 并且我尝试将 *.txt 作为 robocopy 的参数,但效果不佳。知道出了什么问题吗?

您的代码出错,因为 $yesterdayFiles 包含 FileInfo 个对象,这些对象在 robocopy 语句中使用时会扩展到它们的完整路径。 robocopy syntax,然而,是

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
  }