我一直在编写一个脚本来按特定文件类型清点驱动器。(AVI,MPG,MP3等......)
我可以仅使用设置驱动器和扩展名来使基本脚本工作,但我真的希望它从文件读取扩展名,并从文件读取驱动器。
$dir = get-childitem z:\ –recurse
ForEach ($item in $dir)
{
If ($item.extension –eq '.avi')
{
$item | select-object length,fullname,LastWriteTime | Export-CSV C:\temp\z-avi.csv –notypeinformation –append
}
}
当我搜索时,我只找到服务器驱动器空间脚本。
任何指导将不胜感激。
答案1
虽然有些混乱,但我使用 WMI 来获取驱动器,然后根据唯一的扩展进行循环:
$computer = Get-ADcomputer ComputerName
$drives = Get-WmiObject win32_volume -ComputerName $computer.DNSHostName | Where-Object {$_.DriveType -eq 3 -and $_.DriveLetter -ne $null -and $_.Label -ne "System Reserved"}
Foreach ($drive in $drives)
{
$allfiles = gci $drive.DriveLetter -recurse | Select Name,FullName,Extension,Length,LastWriteTime
$extensions = $allfiles | Select -Unique Extension
Foreach ($ext in $extensions)
{
$filename = ($drive | Select -ExpandProperty DriveLetter -First 1)[0] + ($ext | Select -ExpandProperty Extension -First 1)
$extensionfiles = $allfiles | Where-Object {$_.Extension -eq $ext.extension}
#$extensionfiles.count
$extensionfiles | Export-Csv C:\Temp\$filename.csv -Notypeinformation
}
}
WMI 调用将仅返回本地驱动器。
答案2
像这样的事情应该可以解决问题...请注意 Export-Csv 位上的 -WhatIf。
在此示例中,所有 csv 文件都将保存在 C:\temp 下。
$drives = Get-Content .\Drives.txt
$extensions = Get-Content .\Extensions.txt
foreach($drive in $drives)
{
$files = Get-ChildItem -Path "$drive`:\*" -Recurse -Include $($extensions | % { "*.$_" }) | where { $_.PSIsContainer -eq $false }
$grouped = $files | Group-Object -Property Extension
foreach ($group in $grouped)
{
$group | select -ExpandProperty Group | select Length, FullName, LastWriteTime | Export-Csv -Path "C:\Temp\$drive-$($group.Name.Replace('.','')).csv" -Append -NoTypeInformation -WhatIf
}
}
Drives.txt 每行一个驱动器号
C
D
E
[...]
Extensions.txt 每行有一个扩展名。
mp3
mpg
avi
[...]