簡體   English   中英

Powershell列表對象數組

[英]Powershell array of list objects

我正在嘗試編寫一個腳本,該腳本接受f5 LTM結果的文本文件並將其放入可搜索的數組中,以便我可以比較昨天和今天的結果。

這是文件的示例;

MemberCount  : 2
Name         : /Common/blah1
Availability : AVAILABILITY_STATUS_GREEN
Enabled      : ENABLED_STATUS_ENABLED
Status       : The pool is available

MemberCount  : 2
Name         : /Common/blah2
Availability : AVAILABILITY_STATUS_GREEN
Enabled      : ENABLED_STATUS_ENABLED
Status       : The pool is available

因此,理想情況下,我想使“名稱”成為唯一字段,並對列表進行排序,以便我可以比較昨天到今天的狀態變化。

這是我正在通過電子郵件發送結果的代碼,但是它僅提供逐行的區別,而我希望在電子郵件中獲得對象更改。

Add-PSSnapIn iControlSnapIn

$f5_hosts = '192.168.x.x', '192.168.x.x'
$uid = 'xx'
$pwd ='xx'


foreach($f5_host in $f5_hosts){
$f5_host_out = $(get-date -f yyyyMMdd)+"_"+$f5_host+".txt"
$f5_host_out_yesterday = $((get-date).AddDays(-1).ToString('yyyyMMdd'))+"_"+$f5_host+".txt"

#Check login details and generate LTM output file for $f5_host
Initialize-F5.iControl -HostName $f5_host -Username $uid -password $pwd
Get-F5.LTMPool | out-file $f5_host_out

#// Check if EMP file for yesterday exists and send results else send error 
if (Test-Path $f5_host_out_yesterday){
$f5_host_Result = compare-object -ReferenceObject (Get-Content $f5_host_out) -DifferenceObject (Get-Content $f5_host_out_yesterday )
$f5_host_out_yesterday+": file is Present!"
$Text_Body = $f5_host+": difference `r`n"
$Text_Body += ($f5_host_Result | out-string)
Send-MailMessage -to simon.thomason@racq.com.au -from simon.thomason@racq.com.au -subject $f5_host+": F5 Daily LTM Check" -body $Text_Body -smtpserver mailrelay.racqgroup.local
}else{
$f5_host_out_yesterday+": is not file is Present!"
Send-MailMessage -to simon.thomason@racq.com.au -from simon.thomason@racq.com.au -subject $f5_host+": Check failed" -body "Yesterday's file is not present" -smtpserver mailrelay.racqgroup.local
}
}

#Limit File retention to 30days.
$limit = (Get-Date).AddDays(-30)
#Get script location
$path = Get-Location

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

因此,作為輸出,我只想在電子郵件中看到類似的內容

Difference From yesterday to today

Yesterday
MemberCount  : 2
Name         : /Common/blah1
Availability : AVAILABILITY_STATUS_GREEN
Enabled      : ENABLED_STATUS_ENABLED
Status       : The pool is available

Today
MemberCount  : 2
Name         : /Common/blah1
Availability : AVAILABILITY_STATUS_RED
Enabled      : ENABLED_STATUS_ENABLED
Status       : The pool is available

好的,關於第二個問題,即導出和導入密碼,加密是針對每個用戶進行的(我很確定每台機器都是如此),因此您不能導出它,然后讓另一個帳戶導入它,但僅用於直接保存加密的密碼可以使用以下功能:

Function Out-EncryptedPasswordFile{
[cmdletbinding()]
Param(
    [Parameter(Mandatory = $true)]
    [string]$Password,
    [Parameter(Mandatory = $true)]
    [ValidateScript({If(Test-Path (Split-Path $_)){$true}else{Throw "Unable to create file, directory '$(Split-Path $_)\' does not exist."} })][String]$Path
)
    ConvertTo-SecureString -AsPlainText $Password -Force | ConvertFrom-SecureString | Set-Content $Path -Encoding Unicode
}

#Usage Example
#Out-EncryptedPasswordFile TestP@ssw0rd c:\temp\password.txt

Function Import-EncryptedPasswordFile{
[cmdletbinding()]
Param(
    [Parameter(Mandatory = $true)]
    [ValidateScript({Test-Path $_})][string]$Path
)
    $SSPassword = Get-Content $Path | ConvertTo-SecureString
    $Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($SSPassword)
    [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
    [System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
}

#Usage Example
#Import-EncryptedPasswordFile C:\temp\password.txt

不確定是對還是錯,但這給了我想要的結果。 只是使用了json,所以我可以存儲對象並將其轉換回powershell對象。

Add-PSSnapIn iControlSnapIn

$f5_hosts = 'x.x.x.x', 'x.x.x.x'
$uid = 'xx'
$pwd ='xx'


foreach($f5_host in $f5_hosts){
$f5_host_out = $(get-date -f yyyyMMdd)+"_"+$f5_host+".json"
$f5_host_out_yesterday = $((get-date).AddDays(-1).ToString('yyyyMMdd'))+"_"+$f5_host+".json"

#Check login details and generate LTM output file for $f5_host
Initialize-F5.iControl -HostName $f5_host -Username $uid -password $pwd
Get-F5.LTMPool | ConvertTo-Json |  out-file $f5_host_out


#// Check if EMP file for yesterday exists and send results else send error 
if (Test-Path $f5_host_out_yesterday){

$f5_host_json_today = Get-Content -Raw $f5_host_out | ConvertFrom-Json
$f5_host_json_yesterday = Get-Content -Raw $f5_host_out_yesterday | ConvertFrom-Json


$f5_host_Result = Compare-Object -ReferenceObject ($f5_host_json_today | Sort-Object ) -DifferenceObject ($f5_host_json_yesterday | Sort-Object ) -property MemberCount, Name, Status, Availability, Enabled, Status | sort-object -property Name
#$f5_host_Result
$f5_host_out_yesterday+": file is Present!"
$Text_Body = $f5_host+": difference `r`n"
$Text_Body += ($f5_host_Result | out-string)
Send-MailMessage -to y@x -from y@x -subject $f5_host+": F5 Daily LTM Check" -body $Text_Body -smtpserver blah
}else{
$f5_host_out_yesterday+": is not file is Present!"
Send-MailMessage -to y@x -from y@x -subject $f5_host+": Check failed" -body "Yesterday's file is not present" -smtpserver blah
}
}

#Limit File retention to 30days.
$limit = (Get-Date).AddDays(-30)
#Get script location
$path = Get-Location

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM