【问题标题】:Powershell move files older than x match on date in filenamePowershell移动文件名中日期早于x匹配的文件
【发布时间】:2014-07-07 13:01:37
【问题描述】:

所以我有一个从 FTP 服务器引入一堆文件的过程。 我想将超过一个月的文件移动到存档文件夹中。 但是,如果文件被覆盖,使用 LastWriteTime 可能不准确。 幸运的是原始日期存储在文件名中。

#move files older than 1 month to archive
$archive = "\\fhnsrv01\home\aborgetti\Documentation\Stage\archive"
$date = (get-date).AddDays(-31)
GCI \\fhnsrv01\home\aborgetti\Documentation\Stage\*.txt| Where-Object 
{$_.Name -match "^.+?\.D(\d{6}).*" -gt $date.ToString('MMddyy')| move-item -destination $archive

这会按我的预期工作吗?我想从舞台上拉出所有文本文档。他们在某处有约会的地方。根据设置为字符串值的变量 get-date 检查他们的年龄。比较和移动。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    抱歉,这行不通,但总的来说这是一个好主意......它只需要稍加修改即可开始工作。失败的地方是:

    {$_.Name -match "^.+?\.D(\d{6}).*" -gt $date.ToString('MMddyy')| 
    

    这是格式错误的 Where 语句。你让它对一个模式进行正则表达式匹配,如果我正确地记住你的文件名结构,它会找到。那你有匹配吗???大于日期。另外,你错过了它的结束 }。

    你不能做一个:

    Where{$_.CreationTime -lt (get-date).adddays(-31)}
    

    然后它违反了创建时间而不是最后一次修改时间。

    【讨论】:

    • 简单有效。我要买它。谢谢!
    【解决方案2】:

    您的 Where-Object 脚本块存在一些问题。缺少结束符 } 并且 -match 返回一个 True/False,您正在尝试与字符串进行大于比较。试试改成这样:

    ... | Where {if ($_.Name -match '^.+?\.D(\d{6})') { 
                   $fileDate = [DateTime]::ParseExact($matches[1], "MMddyy", $null)
                   $fileDate -gt $date
                }} | Move-Item -Dest $archive
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多