首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有创建日期的Powershell复制文件等于给定日期

带有创建日期的Powershell复制文件等于给定日期
EN

Stack Overflow用户
提问于 2020-12-02 08:28:59
回答 2查看 681关注 0票数 0

我试图复制文件的创建日期等于给定的日期,没有运气,args传递的是当前日期2/12/2020,并创建了一些文件今天,但它没有复制,我遗漏了什么?

代码语言:javascript
运行
复制
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
    }
    
}
EN

Stack Overflow用户

发布于 2020-12-03 11:02:32

在使用PowerShell时,需要记住两件事。

  1. PowerShell是面向对象的.
  2. PowerShell使用管道。

只要你能坚持这些规则,你就会有更多的选择,你的工作也会更容易。

你的输油管道做得很好。

下面是一些工具来研究事物的对象方面。

比较的对象是什么?

在这里,我将使用日期格式为我的地区。我看你用的是日月一年。

您可以使用Get成员来调查PowerShell中的对象。

代码语言:javascript
运行
复制
> "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是什么类型的对象。

代码语言:javascript
运行
复制
> 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对象。

代码语言:javascript
运行
复制
> [DateTime] "12/2/2020"

Wednesday, December 2, 2020 12:00:00 AM

注意,当我们将像"12/2/2020"这样的日期字符串强制转换到DateTime对象时,会自动为HourMinuteSecond属性填充时间。默认情况下,使用午夜。

用日期比较解决问题。

让我们看一下前面查询中的一个DateTime对象。

代码语言:javascript
运行
复制
> 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对象时,我们只需要比较日期部分。这将解决我们的问题。

让我们演示必要的代码。

代码语言:javascript
运行
复制
> [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属性来简化文件副本。

代码语言:javascript
运行
复制
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  }
}

在我的环境中,我能够将一个书签复制到一个备份文件夹中:

代码语言:javascript
运行
复制
$a = "C:\Users\Michael\Desktop\Bookmarklets"
$b = "C:\Users\Michael\Desktop\Backup" 

findLogs -searchDate "12/3/2020" -source $a -destination $b -nameLike "Mark*"
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65104538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档