【问题标题】:Can't access values in an array that's part of a foreach loop in powershell无法访问作为 powershell 中 foreach 循环一部分的数组中的值
【发布时间】:2016-01-22 23:43:15
【问题描述】:

我对 powershell 和编码比较陌生,并且在访问数组中的值时遇到了问题。我正在尝试使用 foreach 遍历一组文件并计算每个文件中的消息数。然后将每个文件的计数放入一个数组中,以便我可以将其分配给一个变量。当我执行 write-host $data[0] 时,它会返回所有值。如果我写主机 $data1 它什么也不返回。似乎这些值都被存储为一个而不是单个数字。如何获取每个值,然后将其分配给变量。任何帮助将不胜感激。

$FilePath = 'some file path here'
$TodaysDate = (Get-Date -format "MM-dd-yyyy")

ForEach($file in Get-ChildItem $FilePath -exclude *.ps1,*.xml,*.xls | Where-Object {$_.LastWriteTime -ge $TodaysDate})
{
    $data = ,@(Get-Content $file | Where-Object {$_.Contains("MSH|")}).Count
    write-host $data[0]
 }
exit

powershell result

【问题讨论】:

    标签: arrays powershell


    【解决方案1】:

    在这一行:

    $data = ,@(Get-Content $file | Where-Object {$_.Contains("MSH|")}).Count
    

    您正在创建一个包含单个元素(计数)的数组。您要做的是每次都添加到 $data :

    $data += ,@(Get-Content $file | Where-Object {$_.Contains("MSH|")}).Count
    

    但是根据您的描述,我认为您可能需要一个哈希表,使用文件名作为键:

    $data = @{} #init hashtable
    ForEach($file in Get-ChildItem $FilePath -exclude *.ps1,*.xml,*.xls | Where-Object {$_.LastWriteTime -ge $TodaysDate})
    {
        $data[$file] = @(Get-Content $file | Where-Object {$_.Contains("MSH|")}).Count
    }
    
    write-output $data
    

    【讨论】:

    • 好的,谢谢,我对哈希表了解不多,但请阅读一点。似乎这会起作用。但是,现在我如何从表中提取每个文件的计数。文件名包含今天的日期,因此每天都会更改,所以我无法通过 $data."filename" 之类的键获取值。我试过这个,不确定这是否是正确的方法: $Count = $data.GetEnumerator() | ? {$_.key -like "file_name*"} write-output $Count 这给了我文件名和计数。我只想将计数分配给变量。
    • 我想我明白了。我只需要将 .value 添加到我的变量中:$Count = $data.GetEnumerator() | ? {$_.key -like "filename*"} write-output $Count.value
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2018-09-30
    相关资源
    最近更新 更多