【问题标题】:Guidance with developing PowerShell script开发 PowerShell 脚本的指导
【发布时间】:2015-10-10 07:37:16
【问题描述】:

无论如何,我都不是高级脚本编写者,但我有一项工作需要完成。任务是创建一个脚本,该脚本查看目录中包含的每个报告文件中的两条信息(日期和使用的容量,以字节为单位)。这两条信息位于每个报告中的相同位置。然后,使用日期值,脚本可以报告每个月的最高容量利用率值。我正在考虑让最终输出为 HTML 格式。

获取日期值有两种选择。报告在文本的第 3 行包含格式为 mm/dd/yyyy 的日期,并且时间作为纪元时间包含在文件名中。

到目前为止,我已经整理了一个 PowerShell 脚本,用于解析报告正文中使用的日期和容量。然后将此信息添加到数组中。

我正在寻找更适合使用哪个日期值的指导(文件名中的纪元时间或报告正文中的日期)以及最适合使用哪种方法来查看每个月的数据并报告最高值每月产能利用率。

到目前为止,这是我的脚本:

#Construct an array to use for data export
$fileDirectory = "c:\Temp"
$Array1 = @()

foreach ($file in Get-ChildItem $fileDirectory)
{
    #Obtain path to each file in directory
    $filePath = $fileDirectory + "\" + $file
    #Get content of each file during the loop
    $data = Get-Content $filePath
    #Create object to enter data into Array1
    $myobj = "" | Select "Date","Capacity"
    $dateStr = ($data[2].Split(" "))[3]
    [long]$capacityStr = ($data[19].Split(","))[2]
    [single]$CapacityConv = $capacityStr
    $capacityConv = ($capacityConv /= 1099511627776)

    #Fill the object myobj
    $myobj.date = $dateStr
    $myobj.capacity = $capacityConv

    #Add the object to Array1
    $Array1 += $myobj

    #Wipe the object
    $myobj = $null
}
#After the loop, export the array to CSV file
$Array1 | export-csv "c:\Scripts\test-output.csv"
$Array1
pause

【问题讨论】:

    标签: powershell powershell-4.0


    【解决方案1】:

    日期,这完全取决于你。如果它们同样准确,那就见仁见智了。

    对于容量,我假设这些是给定日期格式的每日报告,并且您想要给定月份的最大容量。

    由于您正在为每个报告创建一个包含 DateCapacity 属性的对象,使用返回的所有这些值的数组,您应该能够像这样获得所需的信息:

    $Array1 | Group-Object {([DateTime]$_.Date).ToString('MMMM')} | Select-Object Name,@{Name='MaxCap';Expression={ $_.Group.Capacity | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum }}
    

    现在这有点多,所以让我们分解一下。

    Group-Object 根据属性对数组进行分组。在这种情况下,我们希望按月份分组,但您没有月份属性,因此我们在脚本块中传递的不是属性名称,而是动态计算属性:

    ([DateTime]$_.Date).ToString('MMMM')
    

    这会将您的Date 属性(即[String])转换为[DateTime] 对象。然后我们使用.ToString('MMMM') 将其格式化为月份名称。

    结果将是一个组对象数组,其中Name 属性是组的名称(在本例中为月份名称),Group 属性将包含所有原始对象属于那个组。

    将其导入Select-Object,我们需要Name(月份),然后我们正在动态创建一个名为MaxCap的新属性:

    $_.Group.Capacity | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
    

    所以我们采用当前的Group(该月所有对象的数组),然后扩展其Capacity 属性,这样现在我们就有了该组所有容量的数组。

    将其输入Measure-Object -Maximum 以获取最大值,然后Select-Object -ExpandProperty Maximum(因为Measure-Object 返回一个具有Maximum 属性的对象,而我们只需要该值)。

    最终结果是一个包含月份和该月份最大容量的对象。

    【讨论】:

    • 太棒了!非常感谢!!这正是我需要的,而且比我想象的要容易得多,但当然,这是您的专业知识的结果。
    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 2020-12-26
    • 2021-05-11
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多