*.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
}
已编辑:我在 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
}