Powershell脚本,用于查找所有驱动器上的所有备份以及打印文件路径,文件名和文件大小

时间:2015-04-17 14:04:25

标签: powershell

我发现所有脚本都围绕着我需要的答案,但我无法弄清楚如何将它们组合起来。

这是一个脚本,用于查找所有驱动器上的所有备份,但它会移动它们;我只想打印细节(最好归档)。

foreach ($server in Get-Content c:\scripts\sl.txt){
foreach ($root in 'c$','d$','e$','f$'){
cmd /c dir "\\$server\$root\*.bak" /B /S /A-D |%{
 Move-Item $_  -destination C:\users\Scripts
}
}
}

我发现其他人会在一个驱动器中打印出具有特定扩展名的所有文件。

$Extensions = @(".bak",".csv",".txt")
Foreach ( $Extension in $Extensions )
{
 [System.IO.Directory]::EnumerateFiles("C:\","*$Extension","AllDirectories")
}

我很难将两者结合起来并且压力很小。请帮忙!

2 个答案:

答案 0 :(得分:1)

第一个例子使用cmd来调用dir,这是不必要的,因为Get-ChildItem可以进行目录列表。 Get-ChildItem实际上返回了更多信息,并以对象格式返回,这在进一步的脚本编写中非常有用。 Get-Help aliasGet-ChildItemdirls甚至有别名(gci)。 (为命令行保存这些,脚本应使用长格式以便于阅读)。

第二个例子是使用某种.Net环形方法来枚举文件对象的属性。使用点表示法更容易,或者Select-Object -Property直接使用powershell对象。使用' Get-Member'查看对象的属性和方法列表。例如gci | gm

PS M:\> $file = gci c:\windows\notepad.exe

PS M:\> $file.DirectoryName
C:\windows

PS M:\> (gci c:\windows\notepad.exe).DirectoryName
C:\windows

如果你想做oneliner,请事先设置$ server或插入实际名称,并每次更改输出文件名:

"C$","D$","E$","F$" | %{gci "\\$server\$_\*.bak" -recurse} | %{export-csv -notypeinformation -append c:\temp\filelist.csv}

要考虑的另一件事是修改' Get-ChildItem'添加一个属性来保存服务器'属性。由于DirectoryName属性已包含根驱动器号,因此您可以将所有服务器和驱动器.bak文件列表输出到一个文件中。

底线,使用arco444所写的修改版本:

function List-Backups {
    foreach ($server in Get-Content c:\scripts\serverlist.txt){
        foreach ($root in 'c','d','e','f'){
            $outfile = "C:\Temp\FileList-$server-$root.csv"
            Get-ChildItem "\\$server\$root"+'$'+"\*.bak" | 
             Add-Member –MemberType NoteProperty –Name ServerName –Value $server |
             export-csv $outfile -NoTypeInformation -Append
        }
    }
}

这会为您提供一个CSV文件,其中所有文件仍为对象。然后,您可以使用CSV执行所需操作。

import-csv c:\temp\filelist.csv | select Name, DirectoryName

稍后,您可以创建函数以从此函数输出的文本文件中提取信息。

答案 1 :(得分:0)

尝试以下方法:

foreach ($server in Get-Content c:\scripts\sl.txt){
    foreach ($root in 'c$','d$','e$','f$'){
        $files = Get-ChildItem \\$server\$root\*.bak 
        foreach($f in $files) {
          Write-Output "$($f.directoryname) $($f.name) $($f.length)" | Tee-Object -Append C:\output.log
        }
    }
}

对于每个根卷,您可以使用Get-ChildItem命令获取*.bak个文件的列表。这将返回FileInfo个对象的列表,其中包含length(大小),nameLastWriteTime等属性...

您可以通过循环列表并使用.表示法访问来访问这些属性。使用Write-Output将结果打印到屏幕上,您可以选择管道到Tee-Object以打印到屏幕和文件。