1

First of all, this is my first question here. I often come here to browse existing topics, but now I'm hung on my own problem. And I didn't found a helpful resource right now. My biggest concern would be, that it won't work in Powershell... At the moment I try to get a small Powershell tool to save me a lot of time. For those who don't know cw-sysinfo, it is a tool that collects information of any host system (e.g. Hardware-ID, Product Key and stuff like that) and generates *.txt files. My point is, if you have 20, 30 or 80 server in a project, it is a huge amount of time to browse all files and just look for those lines you need and put them together in a *.csv file.

What I have working is more like the basic of the tool, it browses all *.txt in a specific path and checks for my keywords. And here is the problem that I just can use the words prior to those I really need, seen as follow:

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

I don't know how I can tell Powershell to search for "Product Type:"-line and pick the following "Professional" instead. Later on with keys or serial numbers it will be the same problem, that is why I just can't browse for "Standard" or "Professional".

I placed my keywords($controls) in an extra file that I can attach the project folders and don't need to edit in Powershell each time. Code looks like this:

    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
4

2 回答 2

1

I think this is the kind of thing you need, I've changed Select-String to not use the -quiet option, this will return a matches object, one of the properties of this is the line I then split the line on the ':' and trim any spaces. These results are then placed into a new PSObject which in turn is added to an array. The array is then put back on the pipeline at the end.

I also moved the call to get-content to avoid reading each file more than once.

  # 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

Adding the results to a csv is just a case of piping the results to Export-Csv

$results | Export-Csv -Path "results.csv" -NoTypeInformation
于 2013-09-10T07:43:21.663 回答
0

If I understand your question correctly, you want some way to parse each line from your report files and extract values for some "keys". Here are a few lines to give you an idea of how you could proceede. The example is for one file, but can be generalized very easily.

$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"
        }
    }
}
于 2013-09-10T08:04:30.187 回答