已编辑:我在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
的参数,但它也不起作用。知道什么是错的吗?
答案 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
}