0

对 PowerShell 相当陌生,想知道是否有人可以提供以下帮助。基本上我有一个 .txt 文档,其中包含许多由特殊字符 ($) (eg) 分隔的记录

ID
输入日期
姓名
职务
地址
电话
$
ID
输入日期
姓名
职务
地址
电话
$

我想将 $ 之间的每个项目拆分为单独的“记录”,以便我可以遍历每个记录。因此,例如,我可以检查上面的每条记录并返回所有没有输入电话号码的记录的记录 ID。

提前致谢

4

2 回答 2

1

我曾经有同样的要求......这就是我做到的

$loglocation = "C:\test\dump.txt"
$reportlocation = "C:\test\dump.csv"
$linedelimiter = ":"
$blockdelimiter = "FileSize"

$file = Get-Content $loglocation

$report = @()
$block = @{}

foreach ($line in $file)
{ 

    if($line.contains($linedelimiter))
        {
        $key = $line.substring(0,$line.indexof($linedelimiter)).trimend()
        $value = $line.substring($line.indexof($linedelimiter)+1).trimstart()

        $block.Add($key,$value)

        if ($block.keys -contains $blockdelimiter)
            {
            $obj = new-object psobject -property $block
            $report += $obj
            $block = @{}
            }
        }
}

$report
$report | Export-Csv $reportlocation -NoTypeInformation

因此,您循环遍历每一行,定义键和值并将对象添加到哈希表。一旦键包含块分隔符,就会将新对象写入数组并清除哈希表。

在我的例子中, linedelimiter 是一个冒号,而 blockdelimiter 是一个有效的记录,所以你必须做一些改变。让我知道这种方法是否适合您的需求并且您找不到该怎么做。

PS 默认情况下,仅显示数组中第一个对象的注释属性,因此您必须将数组通过管道传输到 Select-Object 并添加所需的所有属性。

总成绩。

于 2013-08-28T08:43:16.493 回答
1

如果每条记录包含固定数量的属性,您可以采用这种方法。它在跳过美元符号行的同时循环创建自定义对象。

$d = Get-Content -Path C:\path\to\text\file.txt
for ($i = 0; $i -lt $d.Length; $i+=7) {
    New-Object -TypeName PsObject -Property @{
        'ID'           = $d[$i]
        'Date Entered' = $d[$i+1]
        'Name'         = $d[$i+2]
        'Title'        = $d[$i+3]
        'Address'      = $d[$i+4]
        'Phone'        = $d[$i+5]
    }
}
于 2013-08-25T05:03:55.783 回答