【问题标题】:Powershell script to find file age from an array用于从数组中查找文件年龄的 Powershell 脚本
【发布时间】:2019-01-11 21:46:17
【问题描述】:

我正在编写一个 powershell 脚本来读取多个共享上由 CreationTime 过滤的文件属性。脚本偶尔会起作用。当我使用单个路径时效果很好,但是当我将文件夹路径添加到数组时会得到混合结果。最令人不安的结果是它成功找到并读取了所有路径,然后包含了 c:windows\system32 下的所有内容。共享为空时同样的异常。

所以我想要完成的是:

  1. 读取共享列表
  2. 读取按“CreationTime”和“Archive”属性过滤的每个共享内容。
  3. 将结果保存到 csv 文件。
  4. 如果文件不为空,则将结果写入事件日志。

这里是代码

$timer = (Get-Date -Format yyy-MM-dd-HHmm)
$Date=(Get-Date).AddHours(-3)
$FolderList = "C:\Software\Scripts\FolderList.txt"
$Folders = get-content $FolderList
$Filepath = "C:\Software\Scripts"
$filename = "$Filepath\" + $timer + "OldFiles.csv"

foreach ($Folder in $Folders)

{
Get-ChildItem $Folder | Where-Object { $_.CreationTime -lt $Date -and $_.Attributes -band [System.IO.FileAttributes]::Archive} | Select Attributes, CreationTime, Fullname | Export-Csv -Path $filename -NoTypeInformation
}

if ( (get-childitem $filename).length -eq 0 )

{

exit
}


  else{

#Write to OpsMgr Log
$Message = get-content $filename 
Write-EventLog -LogName "Operations Manager" -Source "Health Service Script" -EventID 402 -EntryType Information -Message "Old files found. $Message"

}

【问题讨论】:

  • 读取系统目录是由于没有有效路径引起的。这是启动 PoSh 的某些方式的默认位置。这表明您的 $FolderList 某处有问题。
  • 您在 foreach 中对相同的文件名执行 Export-Csv,从而在每次迭代时覆盖该文件 ($folder)。但是你最后只Write-EventLog 一次,因此只报告了最后一个文件夹..

标签: arrays powershell


【解决方案1】:

这个(未经测试的)脚本可能会做你想做的事:

$Date = (Get-Date).AddHours(-3)

$FolderList = "C:\Software\Scripts\FolderList.txt"
$Folders    = Get-Content $FolderList
$Filepath   = "C:\Software\Scripts"

$timer    = (Get-Date -Format yyyy-MM-dd-HHmm)
$filename = Join-Path $Filepath ("{0}_OldFiles.csv" -f $timer)

$Data = foreach ($Folder in $Folders){
    Get-ChildItem $Folder | 
      Where-Object { $_.CreationTime -lt $Date -and 
                     $_.Attributes -band [System.IO.FileAttributes]::Archive} | 
        Select Attributes, CreationTime, Fullname 
}


if ($Data.Count){
    #Write to OpsMgr Log
    $Data | Export-Csv -Path $filename -NoTypeInformation
    $Message = $Data | ConvertTo-Csv
    Write-EventLog -LogName "Operations Manager" -Source "Health Service Script" `
                   -EventID 402 -EntryType Information `
                   -Message "Old files found. $Message"
}

【讨论】:

  • 就像一个魅力。非常感谢 LotPings。 Join-Path 对我来说是一个新的。在导出之前读取数据,简单而天才。
  • 感谢您的反馈,如果答案解决了您的问题,您应该考虑发送至 accept the answer 和/或如果您觉得对 vote up 有帮助。
  • 感谢您向我阐明该过程。在平台上仍然相对较新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多