我试图复制文件的创建日期等于给定的日期,没有运气,args传递的是当前日期2/12/2020
,并创建了一些文件今天,但它没有复制,我遗漏了什么?
码
function findLogs ($searchDate)
{
Get-ChildItem c:\logs | Where-Object{ $_.CreationTime -eq $searchDate -and $_.Name -like "logs*" } | ForEach-Object {
$fileName = $_.Name
Copy-Item "c:\$fileName" -Destination c:\backup
}
}
发布于 2020-12-02 08:57:19
你需要截短时间
function findLogs ($searchDate)
{
Get-ChildItem c:\logs | Where-Object{ ([DateTime]::Parse($_.CreationTime.ToString("yyyy-MM-dd") -eq $searchDate -and $_.Name -like "logs*" } | ForEach-Object {
$fileName = $_.Name
Copy-Item "c:\$fileName" -Destination c:\backup
}
}
发布于 2020-12-03 11:02:32
在使用PowerShell时,需要记住两件事。
只要你能坚持这些规则,你就会有更多的选择,你的工作也会更容易。
你的输油管道做得很好。
下面是一些工具来研究事物的对象方面。
比较的对象是什么?
在这里,我将使用日期格式为我的地区。我看你用的是日月一年。
您可以使用Get成员来调查PowerShell中的对象。
> "12/2/2020" | Get-Member
TypeName: System.String
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object Clone(), System.Objec…
CompareTo Method int CompareTo(System.Object value),…
Contains Method bool Contains(string value), bool C…
...
这里我们看到我们的日期字符串是一个System.String
。
我想知道CreationTime
是什么类型的对象。
> Get-ChildItem -File | Select-Object -First 1 | ForEach-Object CreationTime | Get-Member
TypeName: System.DateTime
Name MemberType Definition
---- ---------- ----------
Add Method datetime Add(timespan value)
AddDays Method datetime AddDays(double value)
AddHours Method datetime AddHours(double value)
...
这里我们看到CreationTime
是一个System.DateTime
。
让我们的值是相同的类型。
如果您想要进行shell样式的字符串比较,没有什么能阻止您。但是,您将失去PowerShell对象的所有丰富性。
原则上,我们是在比较两个日期。因此,让我们将字符串输入转换为DateTime对象。
> [DateTime] "12/2/2020"
Wednesday, December 2, 2020 12:00:00 AM
注意,当我们将像"12/2/2020"
这样的日期字符串强制转换到DateTime
对象时,会自动为Hour
、Minute
和Second
属性填充时间。默认情况下,使用午夜。
用日期比较解决问题。
让我们看一下前面查询中的一个DateTime对象。
> Get-ChildItem -File | Select-Object -First 1 | ForEach-Object CreationTime
Saturday, September 26, 2020 10:57:33 AM
在我的特殊情况下,我的文件显示日期Saturday, September 26, 2020 10:57:33 AM
。
DateTime对象总是包含时间。在我们的情况下,我们不在乎时间。因此,解决问题的一种方法是将对象的时间部分设置为相同的值。然后,当我们比较两个对象时,只有日期部分会影响结果。
让我们看看DateTime的属性和方法,看看是否有什么可以帮助我们的东西。
列表中的第一个属性是日期。这看起来可能很有趣。让我们看看这个。
日期的说明如下:
获取此实例的日期组件。 一个新对象,其日期与此实例相同,时间值设置为午夜12:00:00 (00:00:00)。
这听起来可能很有用。
记住,当我们键入强制转换字符串日期时,我们得到了一个时间部分设置为午夜的DateTime对象。
在这里,我们要做一个约会,并返回相同的日期,时间设置为午夜。
现在,我们有了一种将字符串输入和文件创建时间设置为相同值的方法。所以,当我们比较这些DateTime对象时,我们只需要比较日期部分。这将解决我们的问题。
让我们演示必要的代码。
> [DateTime] "12/2/2020"
Wednesday, December 2, 2020 12:00:00 AM
> Get-ChildItem -File | Select-Object -First 1 | ForEach-Object { $_.CreationTime.Date }
Saturday, September 26, 2020 12:00:00 AM
最终答案
因此,让我们使用[DateTime]
类型转换和Date
属性来修复我们的函数。
在这里,我还添加了带有默认值的参数。我们可以像以前一样调用findLogs
。但是我们也可以选择改变函数的工作方式,而不必重写它。
我还使用了FullName属性来简化文件副本。
function findLogs ([string] $searchDate, [string] $source = "c:\logs", [string] $destination = "c:\backup", [string] $nameLike = "logs*" )
{
Get-ChildItem -Path $source -File |
Where-Object { ($_.CreationTime.Date -eq (([DateTime] $searchDate).Date)) -and ($_.Name -like $nameLike) } |
ForEach-Object { Copy-Item -Path $_.FullName -Destination $destination }
}
在我的环境中,我能够将一个书签复制到一个备份文件夹中:
$a = "C:\Users\Michael\Desktop\Bookmarklets"
$b = "C:\Users\Michael\Desktop\Backup"
findLogs -searchDate "12/3/2020" -source $a -destination $b -nameLike "Mark*"
https://stackoverflow.com/questions/65104538
复制相似问题