首先,这是我的第一个问题。我经常来这里浏览现有的主题,但现在我已经挂了我自己的问题。我现在没有找到有用的资源。我最担心的是,它不会在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
答案 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"
}
}
}