Powershell:在* .txt文件中搜索数据以导出到* .csv

时间:2013-09-10 06:54:40

标签: powershell

首先,这是我的第一个问题。我经常来这里浏览现有的主题,但现在我已经挂了我自己的问题。我现在没有找到有用的资源。我最担心的是,它不会在Powershell中运行......目前我尝试使用一个小型Powershell工具来节省我很多时间。对于那些不了解cw-sysinfo的人来说,它是一个收集任何主机系统信息的工具(例如硬件ID,产品密钥和类似的东西)并生成* .txt文件。 我的观点是,如果项目中有20,30或80个服务器,那么浏览所有文件并查找所需的行并将它们放在一个* .csv文件中需要花费大量时间。

我工作的更像是工具的基础,它浏览特定路径中的所有* .txt并检查我的关键字。问题是我可以使用之前我真正需要的词语,如下所示:

    Operating System:         Windows XP
    Product Type:             Professional
    Service Pack:             Service Pack 3
    ...

我不知道如何告诉Powershell搜索“产品类型:” - 行并选择以下“专业”。稍后使用密钥或序列号就会出现同样的问题,这就是我无法浏览“标准”或“专业”的原因。

我将关键字($ controls)放在一个额外的文件中,我可以附加项目文件夹,而不需要每次都在Powershell中编辑。代码如下所示:

    Function getStringMatch 
    { 
      # Loop through the project directory
      Foreach ($file In $files) 
      { 
        # Check all keywords
        ForEach ($control In $controls) 
        { 
          $result = Get-Content $file.FullName | Select-String $control -quiet -casesensitive 
          If ($result -eq $True) 
          { 

            $match = $file.FullName 
            # Write the filename according to the entry
            "Found :  $control  in:  $match" | Out-File $output -Append 
          } 
        } 
      } 
    } 

    getStringMatch

2 个答案:

答案 0 :(得分:1)

我认为这是你需要的东西,我已经将Select-String更改为不使用-quiet选项,这将返回一个匹配对象,其中一个属性是{ {1}}然后我在':'上拆分线并修剪任何空格。然后将这些结果放入新的PSObject中,然后将其添加到数组中。然后在最后将数组放回管道上。

我还将调用移至line,以避免多次读取每个文件。

get-content

将结果添加到csv只是将结果传递给Export-Csv

的情况
  # Create an array for results
  $results = @()

  # Loop through the project directory
  Foreach ($file In $files) 
  { 
    # load the content once
    $content = Get-Content $file.FullName 

    # Check all keywords
    ForEach ($control In $controls) 
    { 
      # find the line containing the control string
      $result = $content | Select-String $control -casesensitive 
      If ($result) 
      { 
        # tidy up the results and add to the array
        $line = $result.Line -split ":"
        $results += New-Object PSObject -Property @{
            FileName = $file.FullName 
            Control = $line[0].Trim()
            Value = $line[1].Trim()
        }
      } 
    } 
  } 
  # return the results
  $results

答案 1 :(得分:0)

如果我正确理解您的问题,您需要某种方法来解析报告文件中的每一行并提取某些“键”的值。以下几行可以让您了解如何处理。该示例适用于一个文件,但可以非常容易地进行推广。

$config = Get-Content ".\config.txt"


# The stuff you are searching for

$keys = @(
    "Operating System",
    "Product Type",
    "Service Pack"
)

foreach ($line in $config)
{
    $keys | %{
        $regex = "\s*?$($_)\:\s*(?<value>.*?)\s*$"

        if ($line -match $regex)
        {
            $value = $matches.value
            Write-Host "Key: $_`t`tValue: $value"
        }
    }
}