0

新手在这里...非常感谢大家的帮助和意见!

30,000' 视图:创建关于可以/应该从网络中删除的“陈旧数据”的报告。

步骤 1. 从包含 FullName、Name & Length 值的一组服务器中收集以“ST_”或“EDDS1”开头的文件夹列表。

$Path = 
"\\server1.domain.com\b\sqlbackups",
"\\server1.domain.com\b\sqlbackups",
"\\server1.domain.com\b\sqlbackups";

$BackupFolders = @(gci $Path -filter "ST_*" | ?{ $_.PSIsContainer}) | Select FullName,Name,Length
$BackupFolders += @(gci $Path -filter "EDDS1*" | ?{ $_.PSIsContainer}) | Select-Object FullName Name, Length

$BackupFolders | Export-CSV C:\BackupFolders.csv

这会拉入一列长度,但该列中没有列出任何值...

步骤 2. 将此列表与 SQL 表进行比较。如果参考文档(步骤 1)和 SQL 中的特定列中存在值,则查看 SQL 中的“状态选项卡”。如果 SQL 表“状态选项卡”指示“未激活”,则将来自 Step1 和 Client 的 FullName、Name、Length、SQL 表中的 Project Name 输出到 csv 中。

$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = "Server=sqlserver\sharename;Database=database;Integrated Security=True"
$sqlConnection.Open()

$sqlCommand = New-Object System.Data.SqlClient.SqlCommand
$sqlCommand.CommandText = "SELECT * FROM [Table].[dbo].[Matters] WHERE [Status] NOT LIKE 'Active%'"
$sqlCommand.Connection = $sqlConnection
$sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$sqlAdapter.SelectCommand = $sqlCommand
$Dataset = New-Object System.Data.DataSet
$sqlAdapter.Fill($Dataset)
$sqlConnection.Close()

$MatterStatus = @"
C:\MatterStatus.csv
"@

$Dataset.Tables[0] | Select Client,Project,MatterStatus | Export-Csv c:\MatterStatus.csv

问题 1 - 如何让长度属性列在从步骤 1 创建的 csv 中?

问题2 - 我在正确的轨道上吗?与第 1 步相同,最后一个值没有传播……我的 csv 中的 MatterStatus 为空白。

非常感谢任何建议/提示!

4

1 回答 1

0

根据http://technet.microsoft.com/en-us/library/ff730945.aspx,您可以使用gci | Measure-ObjectScripting.FileSystemObjectCOM 对象来获取文件夹大小。

解决方案 1(纯 Powershell):

Function Get-ItemSize($Path) {
    (Get-ChildItem -Recurse -Path:$Path | Measure-Object -Property:Length -Sum | Select -ExpandProperty:Sum) / 1MB
}

解决方案 2(COM 对象):

$objFSO = New-Object -com  Scripting.FileSystemObject
Function Get-ItemSize($Path) {
    ($objFSO.GetFolder($Path).Size) / 1MB
}

结合计算的属性,可以替换

... | Select FullName, Name, Length

和:

... | Select FullName, Name, @{Name='Length'; @Expression= {"{0:N2} MB" -f (Get-ItemSize($_) })

它们提供相同的输出:

PS> Get-item 'D:\Temp' | Select FullName, Name, @{ Name='Length'; Expression = { "{0:N2} MB" -f (Get-ItemSize($_)) } }

FullName                                 Name                                     Length                                 
--------                                 ----                                     ------                                 
D:\Temp                                  Temp                                     58.28 MB                               

我猜 COM 对象在技术上更快,但我把它留给读者作为练习。

于 2013-07-16T17:18:21.627 回答