* .txt文件

时间:2015-07-23 07:00:41

标签: powershell robocopy

已编辑:我在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 = '',而此变量包含有关这些文件的信息,我很确定。

*.txt之后没有Get-ChildItem整个脚本对我来说非常适合:它将文件复制到不同的文件夹,一切正常。

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

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

  

ERROR!参数#3无效:C:\ file1.txt

然后是另一个:

  

ERROR!参数#3无效:C:\ file3.txt

我尝试使用Get-ChildItem –Include *.txt并尝试将*.txt作为robocopy的参数,但它也不起作用。知道什么是错的吗?

1 个答案:

答案 0 :(得分:1)

您的代码错误,因为$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
  }