我发现所有脚本都围绕着我需要的答案,但我无法弄清楚如何将它们组合起来。
这是一个脚本,用于查找所有驱动器上的所有备份,但它会移动它们;我只想打印细节(最好归档)。
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")
}
我很难将两者结合起来并且压力很小。请帮忙!
答案 0 :(得分:1)
第一个例子使用cmd来调用dir,这是不必要的,因为Get-ChildItem可以进行目录列表。 Get-ChildItem
实际上返回了更多信息,并以对象格式返回,这在进一步的脚本编写中非常有用。 Get-Help alias
:Get-ChildItem
,dir
和ls
甚至有别名(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
(大小),name
,LastWriteTime
等属性...
您可以通过循环列表并使用.
表示法访问来访问这些属性。使用Write-Output
将结果打印到屏幕上,您可以选择管道到Tee-Object
以打印到屏幕和文件。