使用PowerShell在对象内操作字符串值

时间:2017-06-20 15:53:16

标签: arrays powershell object

我的目标是获取两个具有主机名的对象(通过导入CSV创建),并将一个列表与另一个列表进行比较,并显示每个列表中缺少的内容。

在我进行比较之前,我需要操纵存储在对象中的主机名。第一步是使用正则表达式删除(-replace)不必要的文本,然后将所有主机名设置为小写(ToLower())。

我不太精通修改现有物品并保持它们完好无损"所以我希望有人可以帮助我。

以下是CSV中存储的数据示例。标题位于第7行,每行数据存储如下:

   ...
 7 "name","IP","OSType"
 8 "WCSMserver.com","10.10.10.10","OSX"
 9 "SERVER2.com","11.11.11.11","Windows"
10 "windowsserver @ SERVER2.com","11.11.11.13","Windows"
11 "winner.comSERVER2.com","11.11.11.12","Windows"
   ...

这是我到目前为止尝试做的一个例子(只是替换名称属性值):

function ReadExcelReport() {
  $global:ConvertedQReportTest = $PSScriptRoot + "\" + "AllSources.csv"
  $global:QReportObject = Get-Content -Path $global:ConvertedQReportTest |
                          Select-Object -Skip 7 |
                          ConvertFrom-Csv
}

ReadExcelReport

$global:QReportObject.name = $global:QReportObject.name | ForEach-Object {
    @($global:QReportObject.name)

    $_ -replace 'WCSM \- ' `
       -replace '.*?@ '`
       -replace '.*?@'`
       -replace '.*?\:\:.*?'`
       -replace '\.cooper\.winner\.com'`
       -replace '\.winner\.com'
}

1 个答案:

答案 0 :(得分:2)

通过执行$global:QReportObject.name | ForEach-Object,您可以循环对象的名称而不是对象。

我已经简化了你的脚本(为了便于阅读):

$csv = @"
"name"
"WCSMserver-remove this-com"
"SERVER2.com","11.11.11.11"
"windowsserver-remove this-"
"winner.comSERVER2.com"
"@

$global:QReportObject = $csv | ConvertFrom-Csv

$global:QReportObject | Out-Default

$global:QReportObject | ForEach-Object {
    $_.name = $_.name -replace '-remove this-'
    $_.name = $_.name.ToLower()
}

$global:QReportObject | Out-Default

这将输出:

name                      
----                      
WCSMserver-remove this-com
SERVER2.com               
windowsserver-remove this-
winner.comSERVER2.com     



name                 
----                 
wcsmservercom        
server2.com          
windowsserver        
winner.comserver2.com