Issue : Output the same line over and over












-1















Below is the code, the idea is to grab a raw output of a differents storage arrays, and parse them in to a csv, the last part of the function is a contribution from this link:



check csv for blank fields and write output if exist blank



But when i output the information, the result is the same hostname writen over and over again, with the same results, using the same lines of the raw file but with only one host info.
The idea would be to have the output with the last check for each different host.



Something like this:



2018-11-13,host1,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,
2018-11-13,host2,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,No-Compliance
2018-11-13,host3,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 101340.6565.6124.1,Compliance
2018-11-13,host4,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,Compliance

$OK = "Compliance"
$FAIL = "No-Compliance"
function Parse_IP_NAS {

#Write-Output "Date, Hostname,version, Config, Value, value 2, value 3, value 4 " | Out-File $finalpatchoutputip.txt -Encoding ASCII

# "Network Information VNX"
$contentnasip = ($ParseFileIP -split "`n")

For($i=0;$i -lt $contentnasip.count;$i++){

if($contentnasip[$i] -match "Hostname:")
{
Write-Host "$infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date"
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo" | Out-File $destination_PARSE_NASIP_NAS_PARSED.txt -Append -Encoding ASCII
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$MatchDNS" | Out-File $destination_PARSE_NASIP_NAS_PARSED_2.txt -Append -Encoding ASCII

#"Hostname Information"
$global:infohostname = $contentnasip[$i+1]
}

elseif($contentnasip[$i] -match "IPv4 Address")
{
#"Ipv4 Address"
$global:infoipv4 = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "IPv4 Netmask")
{
#"Netmask Information"
$global:infonetmask = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "IPv4 Gateway")
{
#"Gateway Information"
$global:gatewayinfo = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "DNS Servers")
{
# "DNS Servers Information"
$global:dnsinfo = ($contentnasip[$i] -split "=")[1]
}
}

$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","Value","value 2","value 3","value 4")
$csvContent | ForEach-Object {
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$MatchDNS" | Out-File $destination_PARSE_NASIP_NAS_PARSED_3.txt -Append -Encoding ASCII
if ([string]::IsNullOrEmpty($_.Value)) {
Write-Host "$($_.HostName) = FAIL" -ForegroundColor Red

$Global:MatchDNS = $FAIL
}
else {
Write-Host "$($_.HostName) = OK" -ForegroundColor Green
$Global:MatchDNS = $OK

}
}


Output ( $destination_PARSE_NASIP_NAS_PARSED.txt ) :



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


The idea:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341, compliance
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37, compliance
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37, compliance
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12, compliance
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91 , compliance
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91 , compliance
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37 , compliance
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427 , compliance
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247 , compliance
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414 , compliance










This is the example of $ParseFileIP





Hostname:
host1-CS0,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.254.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1
Hostname:
Host2,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.255.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1
Hostname:
Host3,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.255.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1









share|improve this question

























  • where is $ParseFileIP & $infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date & $MatchDNS1 ... and LOTS of other stuff coming from? [frown]

    – Lee_Dailey
    Nov 13 '18 at 23:34













  • Can you add your input data and desired result?

    – Mike Twc
    Nov 14 '18 at 4:24











  • This time, the question is WAY too unclear.. Show us where the different variables come from, especially $ParseFileIP. Values like 1023.6445.64.2513 can never be valid IP4v4 addresses, so what are they?

    – Theo
    Nov 14 '18 at 13:59











  • @Lee_Dailey I don't think that the other stuff is important, this function import a raw output and then parse all the info in a csv, the idea is check that csv and if match a IP adress output "compliance" at the end of each line, if you need something else i can show you, thanks

    – A.lacorazza
    Nov 14 '18 at 14:41











  • @MikeTwc done, at the end of the file you can find the parsed information and the idea, thank you

    – A.lacorazza
    Nov 14 '18 at 14:42
















-1















Below is the code, the idea is to grab a raw output of a differents storage arrays, and parse them in to a csv, the last part of the function is a contribution from this link:



check csv for blank fields and write output if exist blank



But when i output the information, the result is the same hostname writen over and over again, with the same results, using the same lines of the raw file but with only one host info.
The idea would be to have the output with the last check for each different host.



Something like this:



2018-11-13,host1,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,
2018-11-13,host2,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,No-Compliance
2018-11-13,host3,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 101340.6565.6124.1,Compliance
2018-11-13,host4,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,Compliance

$OK = "Compliance"
$FAIL = "No-Compliance"
function Parse_IP_NAS {

#Write-Output "Date, Hostname,version, Config, Value, value 2, value 3, value 4 " | Out-File $finalpatchoutputip.txt -Encoding ASCII

# "Network Information VNX"
$contentnasip = ($ParseFileIP -split "`n")

For($i=0;$i -lt $contentnasip.count;$i++){

if($contentnasip[$i] -match "Hostname:")
{
Write-Host "$infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date"
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo" | Out-File $destination_PARSE_NASIP_NAS_PARSED.txt -Append -Encoding ASCII
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$MatchDNS" | Out-File $destination_PARSE_NASIP_NAS_PARSED_2.txt -Append -Encoding ASCII

#"Hostname Information"
$global:infohostname = $contentnasip[$i+1]
}

elseif($contentnasip[$i] -match "IPv4 Address")
{
#"Ipv4 Address"
$global:infoipv4 = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "IPv4 Netmask")
{
#"Netmask Information"
$global:infonetmask = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "IPv4 Gateway")
{
#"Gateway Information"
$global:gatewayinfo = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "DNS Servers")
{
# "DNS Servers Information"
$global:dnsinfo = ($contentnasip[$i] -split "=")[1]
}
}

$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","Value","value 2","value 3","value 4")
$csvContent | ForEach-Object {
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$MatchDNS" | Out-File $destination_PARSE_NASIP_NAS_PARSED_3.txt -Append -Encoding ASCII
if ([string]::IsNullOrEmpty($_.Value)) {
Write-Host "$($_.HostName) = FAIL" -ForegroundColor Red

$Global:MatchDNS = $FAIL
}
else {
Write-Host "$($_.HostName) = OK" -ForegroundColor Green
$Global:MatchDNS = $OK

}
}


Output ( $destination_PARSE_NASIP_NAS_PARSED.txt ) :



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


The idea:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341, compliance
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37, compliance
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37, compliance
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12, compliance
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91 , compliance
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91 , compliance
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37 , compliance
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427 , compliance
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247 , compliance
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414 , compliance










This is the example of $ParseFileIP





Hostname:
host1-CS0,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.254.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1
Hostname:
Host2,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.255.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1
Hostname:
Host3,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.255.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1









share|improve this question

























  • where is $ParseFileIP & $infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date & $MatchDNS1 ... and LOTS of other stuff coming from? [frown]

    – Lee_Dailey
    Nov 13 '18 at 23:34













  • Can you add your input data and desired result?

    – Mike Twc
    Nov 14 '18 at 4:24











  • This time, the question is WAY too unclear.. Show us where the different variables come from, especially $ParseFileIP. Values like 1023.6445.64.2513 can never be valid IP4v4 addresses, so what are they?

    – Theo
    Nov 14 '18 at 13:59











  • @Lee_Dailey I don't think that the other stuff is important, this function import a raw output and then parse all the info in a csv, the idea is check that csv and if match a IP adress output "compliance" at the end of each line, if you need something else i can show you, thanks

    – A.lacorazza
    Nov 14 '18 at 14:41











  • @MikeTwc done, at the end of the file you can find the parsed information and the idea, thank you

    – A.lacorazza
    Nov 14 '18 at 14:42














-1












-1








-1








Below is the code, the idea is to grab a raw output of a differents storage arrays, and parse them in to a csv, the last part of the function is a contribution from this link:



check csv for blank fields and write output if exist blank



But when i output the information, the result is the same hostname writen over and over again, with the same results, using the same lines of the raw file but with only one host info.
The idea would be to have the output with the last check for each different host.



Something like this:



2018-11-13,host1,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,
2018-11-13,host2,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,No-Compliance
2018-11-13,host3,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 101340.6565.6124.1,Compliance
2018-11-13,host4,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,Compliance

$OK = "Compliance"
$FAIL = "No-Compliance"
function Parse_IP_NAS {

#Write-Output "Date, Hostname,version, Config, Value, value 2, value 3, value 4 " | Out-File $finalpatchoutputip.txt -Encoding ASCII

# "Network Information VNX"
$contentnasip = ($ParseFileIP -split "`n")

For($i=0;$i -lt $contentnasip.count;$i++){

if($contentnasip[$i] -match "Hostname:")
{
Write-Host "$infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date"
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo" | Out-File $destination_PARSE_NASIP_NAS_PARSED.txt -Append -Encoding ASCII
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$MatchDNS" | Out-File $destination_PARSE_NASIP_NAS_PARSED_2.txt -Append -Encoding ASCII

#"Hostname Information"
$global:infohostname = $contentnasip[$i+1]
}

elseif($contentnasip[$i] -match "IPv4 Address")
{
#"Ipv4 Address"
$global:infoipv4 = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "IPv4 Netmask")
{
#"Netmask Information"
$global:infonetmask = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "IPv4 Gateway")
{
#"Gateway Information"
$global:gatewayinfo = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "DNS Servers")
{
# "DNS Servers Information"
$global:dnsinfo = ($contentnasip[$i] -split "=")[1]
}
}

$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","Value","value 2","value 3","value 4")
$csvContent | ForEach-Object {
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$MatchDNS" | Out-File $destination_PARSE_NASIP_NAS_PARSED_3.txt -Append -Encoding ASCII
if ([string]::IsNullOrEmpty($_.Value)) {
Write-Host "$($_.HostName) = FAIL" -ForegroundColor Red

$Global:MatchDNS = $FAIL
}
else {
Write-Host "$($_.HostName) = OK" -ForegroundColor Green
$Global:MatchDNS = $OK

}
}


Output ( $destination_PARSE_NASIP_NAS_PARSED.txt ) :



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


The idea:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341, compliance
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37, compliance
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37, compliance
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12, compliance
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91 , compliance
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91 , compliance
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37 , compliance
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427 , compliance
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247 , compliance
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414 , compliance










This is the example of $ParseFileIP





Hostname:
host1-CS0,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.254.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1
Hostname:
Host2,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.255.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1
Hostname:
Host3,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.255.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1









share|improve this question
















Below is the code, the idea is to grab a raw output of a differents storage arrays, and parse them in to a csv, the last part of the function is a contribution from this link:



check csv for blank fields and write output if exist blank



But when i output the information, the result is the same hostname writen over and over again, with the same results, using the same lines of the raw file but with only one host info.
The idea would be to have the output with the last check for each different host.



Something like this:



2018-11-13,host1,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,
2018-11-13,host2,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,No-Compliance
2018-11-13,host3,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 101340.6565.6124.1,Compliance
2018-11-13,host4,7.1.80-3,IP_INFO, 1023.6445.64.2513, 255.255.255.0, 1340.6565.6124.1, 1340.6565.6124.1,Compliance

$OK = "Compliance"
$FAIL = "No-Compliance"
function Parse_IP_NAS {

#Write-Output "Date, Hostname,version, Config, Value, value 2, value 3, value 4 " | Out-File $finalpatchoutputip.txt -Encoding ASCII

# "Network Information VNX"
$contentnasip = ($ParseFileIP -split "`n")

For($i=0;$i -lt $contentnasip.count;$i++){

if($contentnasip[$i] -match "Hostname:")
{
Write-Host "$infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date"
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo" | Out-File $destination_PARSE_NASIP_NAS_PARSED.txt -Append -Encoding ASCII
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$MatchDNS" | Out-File $destination_PARSE_NASIP_NAS_PARSED_2.txt -Append -Encoding ASCII

#"Hostname Information"
$global:infohostname = $contentnasip[$i+1]
}

elseif($contentnasip[$i] -match "IPv4 Address")
{
#"Ipv4 Address"
$global:infoipv4 = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "IPv4 Netmask")
{
#"Netmask Information"
$global:infonetmask = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "IPv4 Gateway")
{
#"Gateway Information"
$global:gatewayinfo = ($contentnasip[$i] -split "=")[1]
}
elseif($contentnasip[$i] -match "DNS Servers")
{
# "DNS Servers Information"
$global:dnsinfo = ($contentnasip[$i] -split "=")[1]
}
}

$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","Value","value 2","value 3","value 4")
$csvContent | ForEach-Object {
Write-Output "$date,$infohostname,IP_INFO,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$MatchDNS" | Out-File $destination_PARSE_NASIP_NAS_PARSED_3.txt -Append -Encoding ASCII
if ([string]::IsNullOrEmpty($_.Value)) {
Write-Host "$($_.HostName) = FAIL" -ForegroundColor Red

$Global:MatchDNS = $FAIL
}
else {
Write-Host "$($_.HostName) = OK" -ForegroundColor Green
$Global:MatchDNS = $OK

}
}


Output ( $destination_PARSE_NASIP_NAS_PARSED.txt ) :



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


The idea:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341, compliance
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37, compliance
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37, compliance
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12, compliance
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91 , compliance
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91 , compliance
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37 , compliance
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427 , compliance
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247 , compliance
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414 , compliance










This is the example of $ParseFileIP





Hostname:
host1-CS0,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.254.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1
Hostname:
Host2,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.255.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1
Hostname:
Host3,8.1.9-184
Network:
IPv4 Address = 1.1.1.1.1
IPv4 Netmask = 255.255.255.0
IPv4 Gateway = 1.1.1.1.1
DNS Servers = 1.1.1.1.1,1.1.1.1.1






powershell csv parsing powershell-v4.0 text-parsing






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 '18 at 15:28







A.lacorazza

















asked Nov 13 '18 at 19:57









A.lacorazzaA.lacorazza

426




426













  • where is $ParseFileIP & $infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date & $MatchDNS1 ... and LOTS of other stuff coming from? [frown]

    – Lee_Dailey
    Nov 13 '18 at 23:34













  • Can you add your input data and desired result?

    – Mike Twc
    Nov 14 '18 at 4:24











  • This time, the question is WAY too unclear.. Show us where the different variables come from, especially $ParseFileIP. Values like 1023.6445.64.2513 can never be valid IP4v4 addresses, so what are they?

    – Theo
    Nov 14 '18 at 13:59











  • @Lee_Dailey I don't think that the other stuff is important, this function import a raw output and then parse all the info in a csv, the idea is check that csv and if match a IP adress output "compliance" at the end of each line, if you need something else i can show you, thanks

    – A.lacorazza
    Nov 14 '18 at 14:41











  • @MikeTwc done, at the end of the file you can find the parsed information and the idea, thank you

    – A.lacorazza
    Nov 14 '18 at 14:42



















  • where is $ParseFileIP & $infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date & $MatchDNS1 ... and LOTS of other stuff coming from? [frown]

    – Lee_Dailey
    Nov 13 '18 at 23:34













  • Can you add your input data and desired result?

    – Mike Twc
    Nov 14 '18 at 4:24











  • This time, the question is WAY too unclear.. Show us where the different variables come from, especially $ParseFileIP. Values like 1023.6445.64.2513 can never be valid IP4v4 addresses, so what are they?

    – Theo
    Nov 14 '18 at 13:59











  • @Lee_Dailey I don't think that the other stuff is important, this function import a raw output and then parse all the info in a csv, the idea is check that csv and if match a IP adress output "compliance" at the end of each line, if you need something else i can show you, thanks

    – A.lacorazza
    Nov 14 '18 at 14:41











  • @MikeTwc done, at the end of the file you can find the parsed information and the idea, thank you

    – A.lacorazza
    Nov 14 '18 at 14:42

















where is $ParseFileIP & $infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date & $MatchDNS1 ... and LOTS of other stuff coming from? [frown]

– Lee_Dailey
Nov 13 '18 at 23:34







where is $ParseFileIP & $infohostname,$infoipv4,$infonetmask,$gatewayinfo,$dnsinfo,$date & $MatchDNS1 ... and LOTS of other stuff coming from? [frown]

– Lee_Dailey
Nov 13 '18 at 23:34















Can you add your input data and desired result?

– Mike Twc
Nov 14 '18 at 4:24





Can you add your input data and desired result?

– Mike Twc
Nov 14 '18 at 4:24













This time, the question is WAY too unclear.. Show us where the different variables come from, especially $ParseFileIP. Values like 1023.6445.64.2513 can never be valid IP4v4 addresses, so what are they?

– Theo
Nov 14 '18 at 13:59





This time, the question is WAY too unclear.. Show us where the different variables come from, especially $ParseFileIP. Values like 1023.6445.64.2513 can never be valid IP4v4 addresses, so what are they?

– Theo
Nov 14 '18 at 13:59













@Lee_Dailey I don't think that the other stuff is important, this function import a raw output and then parse all the info in a csv, the idea is check that csv and if match a IP adress output "compliance" at the end of each line, if you need something else i can show you, thanks

– A.lacorazza
Nov 14 '18 at 14:41





@Lee_Dailey I don't think that the other stuff is important, this function import a raw output and then parse all the info in a csv, the idea is check that csv and if match a IP adress output "compliance" at the end of each line, if you need something else i can show you, thanks

– A.lacorazza
Nov 14 '18 at 14:41













@MikeTwc done, at the end of the file you can find the parsed information and the idea, thank you

– A.lacorazza
Nov 14 '18 at 14:42





@MikeTwc done, at the end of the file you can find the parsed information and the idea, thank you

– A.lacorazza
Nov 14 '18 at 14:42












1 Answer
1






active

oldest

votes


















1














Ok, so if your function Parse_IP_NAS creates a file called IP_NAS_PARSED.txt that looks like this:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


and all you want is code that reads that IP_NAS_PARSED.txt to do a check on the existance if the IPv4 value and append a field after each line, I think all you have to do is this AFTER the IP_NAS_PARSED.txt is created:



# read the IP_NAS_PARSED.txt created by the 'Parse_IP_NAS' function and create a comma delimited .TXT file from it with the value '$MatchDNS' appended

# check if the file "$destination_PARSE_NASIP_NAS_PARSED_3.txt" already exists. delete it if it does.
if (Test-Path -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt") {
Remove-Item -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force -ErrorAction SilentlyContinue
}

$OK = "Compliance"
$FAIL = "No-Compliance"
$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","IPv4","SubnetMask","Gateway","DNS1","DNS2")
$csvContent | ForEach-Object {
# you can use IsNullOrEmpty() too in your case, but use 'IsNullOrWhiteSpace()' for safety if ever you decide to quote the values.
if ([string]::IsNullOrWhiteSpace($_.IPv4)) {
$color = 'Red'
$MatchDNS = $FAIL
}
else {
$color = 'Green'
$MatchDNS = $OK
}

# create a comma delimited line and show it in the console
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.version, $_.Config, $_.IPv4, $_.SubnetMask, $_.Gateway, $_.DNS1, $_.DNS2, $MatchDNS
Write-Host $newline -ForegroundColor $color

# and add it to file "IP_NAS_PARSED_3.txt" manually (Add-Content wil create the file if it does not exist)
$newline | Add-Content -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force
}


Note: this code follows your function Parse_IP_NAS and is not meant to be inside that function.





EDIT



Maybe it is even a better idea to redo the Parse_IP_NAS function a bit, so we can streamline the parsing more efficiently and we don't need any 'in-between' files.



Just a thought, but how about this:



function Parse_IP_NAS {
[CmdletBinding(DefaultParameterSetName = 'ByContent')]
Param(
[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByContent')]
[string]$Content,

[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByFileName')]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})]
[string]$Path
)
if ($PSCmdlet.ParameterSetName -eq 'ByFileName') {
$Content = Get-Content -Path $Path -Raw
}

# create an array to store the resulting objects
$result = @()
# split the content of the "Network Information VNX" in $Content into blocks
# Each block starts with "Hostname:"
foreach ($hostBlock in ($Content -split "Hostname:")) {
# skip if we have nothing in the block
if ([string]::IsNullOrWhiteSpace($hostBlock)) { continue }

# create a PSCustomObject with these properties:
$parsedHost = '' | Select-Object 'Date','Hostname','Version','Config','IPv4','SubnetMask','Gateway','DNS1','DNS2','MatchDNS'

## I'm not sure where the Date came from.. Is that today's date?
$parsedHost.Date = (Get-Date).ToString('yyyy-MM-dd')
$parsedHost.Config = 'IP_INFO'

# split the $hostBlock textblock on newlines (r = CR, n = LF) to get an array
# loop through the lines, but skip the line 'Network:' and any possible empty or whitespace-only strings
($hostBlock -split 'r?n') | Where-Object { $_ -match 'S' -and $_ -notmatch 'Network:' } | ForEach-Object {
if ($_ -match '=') {
$value = ($_ -split '=')
switch -regex ($value[0]) {
'IPv4 Address' { $parsedHost.IPv4 = $value[1].Trim() }
'IPv4 Netmask' { $parsedHost.SubnetMask = $value[1].Trim() }
'IPv4 Gateway' { $parsedHost.Gateway = $value[1].Trim() }
'DNS Servers' { $parsedHost.DNS1, $parsedHost.DNS2 = ($value[1] -split ',') | ForEach-Object { $_.Trim()}}
}
}
else {
$parsedHost.Hostname, $parsedHost.Version = ($_ -split ',') | ForEach-Object { $_.Trim() }
}
}

# now check if the IPv4 value is set for this host
if ([string]::IsNullOrWhiteSpace($parsedHost.IPv4)) {
$color = 'Red'
$parsedHost.MatchDNS = 'No-Compliance' # $FAIL
}
else {
$color = 'Green'
$parsedHost.MatchDNS = 'Compliance' # $OK
}

# add the object to the $result array
$result += $parsedHost

# add some visual output to the console
$message = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $parsedHost.Date, $parsedHost.Hostname, $parsedHost.Version,
$parsedHost.Config, $parsedHost.IPv4, $parsedHost.SubnetMask,
$parsedHost.Gateway, $parsedHost.DNS1, $parsedHost.DNS2, $parsedHost.MatchDNS
Write-Host $message -ForegroundColor $color
}
return $result
}


Now you can execute the Parse_IP_NAS function to use either parameter 'Content' if you already have the content in a string variable like:



$parsedResult = Parse_IP_NAS -Content $ParseFileIP


Or feed it the full path and name of the file so it will read the content for you:



$parsedResult = Parse_IP_NAS -Path '<path to the Network Information VNX file>'


After this call to the function, we have an array of objects with all values for each host found in $parsedResult as objects, so this is where you choose what to do with this info:



Scenario 1

Create the output manually so it will become a file of comma delimited values without quotes around them:



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.txt"

# check if the output file already exists. delete it if it does.
if (Test-Path -Path $outputFile -PathType Leaf) {
Remove-Item -Path $outputFile -Force -ErrorAction SilentlyContinue
}

# if you DO want headers in this file, uncomment the next line:
# Add-Content -Path $outputFile -Value 'Date,Hostname,Version,Config,IPv4,SubnetMask,Gateway,DNS1,DNS2,MatchDNS'

# loop through the $parsedResult array and build a line for each object in there
$parsedResult | ForEach-Object {
# create a comma delimited line and add it to the outputfile manually
# (Add-Content wil create the file if it does not exist and default)
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.Version,
$_.Config, $_.IPv4, $_.SubnetMask,
$_.Gateway, $_.DNS1, $_.DNS2, $_.MatchDNS
$newline | Add-Content -Path $outputFile -Force
}


Scenario 2

Use PowerShells Export-Csv cmdlet and output the $parsedResult array as proper CSV file. The field values will have quotes around them.



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.csv"
$parsedResult | Export-Csv -Path $outputFile -NoTypeInformation -Encoding ASCII -Delimiter ',' -Force





share|improve this answer


























  • @Agustinlacorazza I have added some more code in my answer with an alternative Parse_IP_NAS function. It is just an idea I had to maybe streamline things a bit. Cheers!

    – Theo
    Nov 15 '18 at 14:29











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53288573%2fissue-output-the-same-line-over-and-over%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














Ok, so if your function Parse_IP_NAS creates a file called IP_NAS_PARSED.txt that looks like this:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


and all you want is code that reads that IP_NAS_PARSED.txt to do a check on the existance if the IPv4 value and append a field after each line, I think all you have to do is this AFTER the IP_NAS_PARSED.txt is created:



# read the IP_NAS_PARSED.txt created by the 'Parse_IP_NAS' function and create a comma delimited .TXT file from it with the value '$MatchDNS' appended

# check if the file "$destination_PARSE_NASIP_NAS_PARSED_3.txt" already exists. delete it if it does.
if (Test-Path -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt") {
Remove-Item -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force -ErrorAction SilentlyContinue
}

$OK = "Compliance"
$FAIL = "No-Compliance"
$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","IPv4","SubnetMask","Gateway","DNS1","DNS2")
$csvContent | ForEach-Object {
# you can use IsNullOrEmpty() too in your case, but use 'IsNullOrWhiteSpace()' for safety if ever you decide to quote the values.
if ([string]::IsNullOrWhiteSpace($_.IPv4)) {
$color = 'Red'
$MatchDNS = $FAIL
}
else {
$color = 'Green'
$MatchDNS = $OK
}

# create a comma delimited line and show it in the console
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.version, $_.Config, $_.IPv4, $_.SubnetMask, $_.Gateway, $_.DNS1, $_.DNS2, $MatchDNS
Write-Host $newline -ForegroundColor $color

# and add it to file "IP_NAS_PARSED_3.txt" manually (Add-Content wil create the file if it does not exist)
$newline | Add-Content -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force
}


Note: this code follows your function Parse_IP_NAS and is not meant to be inside that function.





EDIT



Maybe it is even a better idea to redo the Parse_IP_NAS function a bit, so we can streamline the parsing more efficiently and we don't need any 'in-between' files.



Just a thought, but how about this:



function Parse_IP_NAS {
[CmdletBinding(DefaultParameterSetName = 'ByContent')]
Param(
[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByContent')]
[string]$Content,

[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByFileName')]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})]
[string]$Path
)
if ($PSCmdlet.ParameterSetName -eq 'ByFileName') {
$Content = Get-Content -Path $Path -Raw
}

# create an array to store the resulting objects
$result = @()
# split the content of the "Network Information VNX" in $Content into blocks
# Each block starts with "Hostname:"
foreach ($hostBlock in ($Content -split "Hostname:")) {
# skip if we have nothing in the block
if ([string]::IsNullOrWhiteSpace($hostBlock)) { continue }

# create a PSCustomObject with these properties:
$parsedHost = '' | Select-Object 'Date','Hostname','Version','Config','IPv4','SubnetMask','Gateway','DNS1','DNS2','MatchDNS'

## I'm not sure where the Date came from.. Is that today's date?
$parsedHost.Date = (Get-Date).ToString('yyyy-MM-dd')
$parsedHost.Config = 'IP_INFO'

# split the $hostBlock textblock on newlines (r = CR, n = LF) to get an array
# loop through the lines, but skip the line 'Network:' and any possible empty or whitespace-only strings
($hostBlock -split 'r?n') | Where-Object { $_ -match 'S' -and $_ -notmatch 'Network:' } | ForEach-Object {
if ($_ -match '=') {
$value = ($_ -split '=')
switch -regex ($value[0]) {
'IPv4 Address' { $parsedHost.IPv4 = $value[1].Trim() }
'IPv4 Netmask' { $parsedHost.SubnetMask = $value[1].Trim() }
'IPv4 Gateway' { $parsedHost.Gateway = $value[1].Trim() }
'DNS Servers' { $parsedHost.DNS1, $parsedHost.DNS2 = ($value[1] -split ',') | ForEach-Object { $_.Trim()}}
}
}
else {
$parsedHost.Hostname, $parsedHost.Version = ($_ -split ',') | ForEach-Object { $_.Trim() }
}
}

# now check if the IPv4 value is set for this host
if ([string]::IsNullOrWhiteSpace($parsedHost.IPv4)) {
$color = 'Red'
$parsedHost.MatchDNS = 'No-Compliance' # $FAIL
}
else {
$color = 'Green'
$parsedHost.MatchDNS = 'Compliance' # $OK
}

# add the object to the $result array
$result += $parsedHost

# add some visual output to the console
$message = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $parsedHost.Date, $parsedHost.Hostname, $parsedHost.Version,
$parsedHost.Config, $parsedHost.IPv4, $parsedHost.SubnetMask,
$parsedHost.Gateway, $parsedHost.DNS1, $parsedHost.DNS2, $parsedHost.MatchDNS
Write-Host $message -ForegroundColor $color
}
return $result
}


Now you can execute the Parse_IP_NAS function to use either parameter 'Content' if you already have the content in a string variable like:



$parsedResult = Parse_IP_NAS -Content $ParseFileIP


Or feed it the full path and name of the file so it will read the content for you:



$parsedResult = Parse_IP_NAS -Path '<path to the Network Information VNX file>'


After this call to the function, we have an array of objects with all values for each host found in $parsedResult as objects, so this is where you choose what to do with this info:



Scenario 1

Create the output manually so it will become a file of comma delimited values without quotes around them:



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.txt"

# check if the output file already exists. delete it if it does.
if (Test-Path -Path $outputFile -PathType Leaf) {
Remove-Item -Path $outputFile -Force -ErrorAction SilentlyContinue
}

# if you DO want headers in this file, uncomment the next line:
# Add-Content -Path $outputFile -Value 'Date,Hostname,Version,Config,IPv4,SubnetMask,Gateway,DNS1,DNS2,MatchDNS'

# loop through the $parsedResult array and build a line for each object in there
$parsedResult | ForEach-Object {
# create a comma delimited line and add it to the outputfile manually
# (Add-Content wil create the file if it does not exist and default)
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.Version,
$_.Config, $_.IPv4, $_.SubnetMask,
$_.Gateway, $_.DNS1, $_.DNS2, $_.MatchDNS
$newline | Add-Content -Path $outputFile -Force
}


Scenario 2

Use PowerShells Export-Csv cmdlet and output the $parsedResult array as proper CSV file. The field values will have quotes around them.



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.csv"
$parsedResult | Export-Csv -Path $outputFile -NoTypeInformation -Encoding ASCII -Delimiter ',' -Force





share|improve this answer


























  • @Agustinlacorazza I have added some more code in my answer with an alternative Parse_IP_NAS function. It is just an idea I had to maybe streamline things a bit. Cheers!

    – Theo
    Nov 15 '18 at 14:29
















1














Ok, so if your function Parse_IP_NAS creates a file called IP_NAS_PARSED.txt that looks like this:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


and all you want is code that reads that IP_NAS_PARSED.txt to do a check on the existance if the IPv4 value and append a field after each line, I think all you have to do is this AFTER the IP_NAS_PARSED.txt is created:



# read the IP_NAS_PARSED.txt created by the 'Parse_IP_NAS' function and create a comma delimited .TXT file from it with the value '$MatchDNS' appended

# check if the file "$destination_PARSE_NASIP_NAS_PARSED_3.txt" already exists. delete it if it does.
if (Test-Path -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt") {
Remove-Item -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force -ErrorAction SilentlyContinue
}

$OK = "Compliance"
$FAIL = "No-Compliance"
$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","IPv4","SubnetMask","Gateway","DNS1","DNS2")
$csvContent | ForEach-Object {
# you can use IsNullOrEmpty() too in your case, but use 'IsNullOrWhiteSpace()' for safety if ever you decide to quote the values.
if ([string]::IsNullOrWhiteSpace($_.IPv4)) {
$color = 'Red'
$MatchDNS = $FAIL
}
else {
$color = 'Green'
$MatchDNS = $OK
}

# create a comma delimited line and show it in the console
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.version, $_.Config, $_.IPv4, $_.SubnetMask, $_.Gateway, $_.DNS1, $_.DNS2, $MatchDNS
Write-Host $newline -ForegroundColor $color

# and add it to file "IP_NAS_PARSED_3.txt" manually (Add-Content wil create the file if it does not exist)
$newline | Add-Content -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force
}


Note: this code follows your function Parse_IP_NAS and is not meant to be inside that function.





EDIT



Maybe it is even a better idea to redo the Parse_IP_NAS function a bit, so we can streamline the parsing more efficiently and we don't need any 'in-between' files.



Just a thought, but how about this:



function Parse_IP_NAS {
[CmdletBinding(DefaultParameterSetName = 'ByContent')]
Param(
[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByContent')]
[string]$Content,

[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByFileName')]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})]
[string]$Path
)
if ($PSCmdlet.ParameterSetName -eq 'ByFileName') {
$Content = Get-Content -Path $Path -Raw
}

# create an array to store the resulting objects
$result = @()
# split the content of the "Network Information VNX" in $Content into blocks
# Each block starts with "Hostname:"
foreach ($hostBlock in ($Content -split "Hostname:")) {
# skip if we have nothing in the block
if ([string]::IsNullOrWhiteSpace($hostBlock)) { continue }

# create a PSCustomObject with these properties:
$parsedHost = '' | Select-Object 'Date','Hostname','Version','Config','IPv4','SubnetMask','Gateway','DNS1','DNS2','MatchDNS'

## I'm not sure where the Date came from.. Is that today's date?
$parsedHost.Date = (Get-Date).ToString('yyyy-MM-dd')
$parsedHost.Config = 'IP_INFO'

# split the $hostBlock textblock on newlines (r = CR, n = LF) to get an array
# loop through the lines, but skip the line 'Network:' and any possible empty or whitespace-only strings
($hostBlock -split 'r?n') | Where-Object { $_ -match 'S' -and $_ -notmatch 'Network:' } | ForEach-Object {
if ($_ -match '=') {
$value = ($_ -split '=')
switch -regex ($value[0]) {
'IPv4 Address' { $parsedHost.IPv4 = $value[1].Trim() }
'IPv4 Netmask' { $parsedHost.SubnetMask = $value[1].Trim() }
'IPv4 Gateway' { $parsedHost.Gateway = $value[1].Trim() }
'DNS Servers' { $parsedHost.DNS1, $parsedHost.DNS2 = ($value[1] -split ',') | ForEach-Object { $_.Trim()}}
}
}
else {
$parsedHost.Hostname, $parsedHost.Version = ($_ -split ',') | ForEach-Object { $_.Trim() }
}
}

# now check if the IPv4 value is set for this host
if ([string]::IsNullOrWhiteSpace($parsedHost.IPv4)) {
$color = 'Red'
$parsedHost.MatchDNS = 'No-Compliance' # $FAIL
}
else {
$color = 'Green'
$parsedHost.MatchDNS = 'Compliance' # $OK
}

# add the object to the $result array
$result += $parsedHost

# add some visual output to the console
$message = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $parsedHost.Date, $parsedHost.Hostname, $parsedHost.Version,
$parsedHost.Config, $parsedHost.IPv4, $parsedHost.SubnetMask,
$parsedHost.Gateway, $parsedHost.DNS1, $parsedHost.DNS2, $parsedHost.MatchDNS
Write-Host $message -ForegroundColor $color
}
return $result
}


Now you can execute the Parse_IP_NAS function to use either parameter 'Content' if you already have the content in a string variable like:



$parsedResult = Parse_IP_NAS -Content $ParseFileIP


Or feed it the full path and name of the file so it will read the content for you:



$parsedResult = Parse_IP_NAS -Path '<path to the Network Information VNX file>'


After this call to the function, we have an array of objects with all values for each host found in $parsedResult as objects, so this is where you choose what to do with this info:



Scenario 1

Create the output manually so it will become a file of comma delimited values without quotes around them:



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.txt"

# check if the output file already exists. delete it if it does.
if (Test-Path -Path $outputFile -PathType Leaf) {
Remove-Item -Path $outputFile -Force -ErrorAction SilentlyContinue
}

# if you DO want headers in this file, uncomment the next line:
# Add-Content -Path $outputFile -Value 'Date,Hostname,Version,Config,IPv4,SubnetMask,Gateway,DNS1,DNS2,MatchDNS'

# loop through the $parsedResult array and build a line for each object in there
$parsedResult | ForEach-Object {
# create a comma delimited line and add it to the outputfile manually
# (Add-Content wil create the file if it does not exist and default)
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.Version,
$_.Config, $_.IPv4, $_.SubnetMask,
$_.Gateway, $_.DNS1, $_.DNS2, $_.MatchDNS
$newline | Add-Content -Path $outputFile -Force
}


Scenario 2

Use PowerShells Export-Csv cmdlet and output the $parsedResult array as proper CSV file. The field values will have quotes around them.



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.csv"
$parsedResult | Export-Csv -Path $outputFile -NoTypeInformation -Encoding ASCII -Delimiter ',' -Force





share|improve this answer


























  • @Agustinlacorazza I have added some more code in my answer with an alternative Parse_IP_NAS function. It is just an idea I had to maybe streamline things a bit. Cheers!

    – Theo
    Nov 15 '18 at 14:29














1












1








1







Ok, so if your function Parse_IP_NAS creates a file called IP_NAS_PARSED.txt that looks like this:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


and all you want is code that reads that IP_NAS_PARSED.txt to do a check on the existance if the IPv4 value and append a field after each line, I think all you have to do is this AFTER the IP_NAS_PARSED.txt is created:



# read the IP_NAS_PARSED.txt created by the 'Parse_IP_NAS' function and create a comma delimited .TXT file from it with the value '$MatchDNS' appended

# check if the file "$destination_PARSE_NASIP_NAS_PARSED_3.txt" already exists. delete it if it does.
if (Test-Path -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt") {
Remove-Item -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force -ErrorAction SilentlyContinue
}

$OK = "Compliance"
$FAIL = "No-Compliance"
$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","IPv4","SubnetMask","Gateway","DNS1","DNS2")
$csvContent | ForEach-Object {
# you can use IsNullOrEmpty() too in your case, but use 'IsNullOrWhiteSpace()' for safety if ever you decide to quote the values.
if ([string]::IsNullOrWhiteSpace($_.IPv4)) {
$color = 'Red'
$MatchDNS = $FAIL
}
else {
$color = 'Green'
$MatchDNS = $OK
}

# create a comma delimited line and show it in the console
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.version, $_.Config, $_.IPv4, $_.SubnetMask, $_.Gateway, $_.DNS1, $_.DNS2, $MatchDNS
Write-Host $newline -ForegroundColor $color

# and add it to file "IP_NAS_PARSED_3.txt" manually (Add-Content wil create the file if it does not exist)
$newline | Add-Content -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force
}


Note: this code follows your function Parse_IP_NAS and is not meant to be inside that function.





EDIT



Maybe it is even a better idea to redo the Parse_IP_NAS function a bit, so we can streamline the parsing more efficiently and we don't need any 'in-between' files.



Just a thought, but how about this:



function Parse_IP_NAS {
[CmdletBinding(DefaultParameterSetName = 'ByContent')]
Param(
[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByContent')]
[string]$Content,

[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByFileName')]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})]
[string]$Path
)
if ($PSCmdlet.ParameterSetName -eq 'ByFileName') {
$Content = Get-Content -Path $Path -Raw
}

# create an array to store the resulting objects
$result = @()
# split the content of the "Network Information VNX" in $Content into blocks
# Each block starts with "Hostname:"
foreach ($hostBlock in ($Content -split "Hostname:")) {
# skip if we have nothing in the block
if ([string]::IsNullOrWhiteSpace($hostBlock)) { continue }

# create a PSCustomObject with these properties:
$parsedHost = '' | Select-Object 'Date','Hostname','Version','Config','IPv4','SubnetMask','Gateway','DNS1','DNS2','MatchDNS'

## I'm not sure where the Date came from.. Is that today's date?
$parsedHost.Date = (Get-Date).ToString('yyyy-MM-dd')
$parsedHost.Config = 'IP_INFO'

# split the $hostBlock textblock on newlines (r = CR, n = LF) to get an array
# loop through the lines, but skip the line 'Network:' and any possible empty or whitespace-only strings
($hostBlock -split 'r?n') | Where-Object { $_ -match 'S' -and $_ -notmatch 'Network:' } | ForEach-Object {
if ($_ -match '=') {
$value = ($_ -split '=')
switch -regex ($value[0]) {
'IPv4 Address' { $parsedHost.IPv4 = $value[1].Trim() }
'IPv4 Netmask' { $parsedHost.SubnetMask = $value[1].Trim() }
'IPv4 Gateway' { $parsedHost.Gateway = $value[1].Trim() }
'DNS Servers' { $parsedHost.DNS1, $parsedHost.DNS2 = ($value[1] -split ',') | ForEach-Object { $_.Trim()}}
}
}
else {
$parsedHost.Hostname, $parsedHost.Version = ($_ -split ',') | ForEach-Object { $_.Trim() }
}
}

# now check if the IPv4 value is set for this host
if ([string]::IsNullOrWhiteSpace($parsedHost.IPv4)) {
$color = 'Red'
$parsedHost.MatchDNS = 'No-Compliance' # $FAIL
}
else {
$color = 'Green'
$parsedHost.MatchDNS = 'Compliance' # $OK
}

# add the object to the $result array
$result += $parsedHost

# add some visual output to the console
$message = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $parsedHost.Date, $parsedHost.Hostname, $parsedHost.Version,
$parsedHost.Config, $parsedHost.IPv4, $parsedHost.SubnetMask,
$parsedHost.Gateway, $parsedHost.DNS1, $parsedHost.DNS2, $parsedHost.MatchDNS
Write-Host $message -ForegroundColor $color
}
return $result
}


Now you can execute the Parse_IP_NAS function to use either parameter 'Content' if you already have the content in a string variable like:



$parsedResult = Parse_IP_NAS -Content $ParseFileIP


Or feed it the full path and name of the file so it will read the content for you:



$parsedResult = Parse_IP_NAS -Path '<path to the Network Information VNX file>'


After this call to the function, we have an array of objects with all values for each host found in $parsedResult as objects, so this is where you choose what to do with this info:



Scenario 1

Create the output manually so it will become a file of comma delimited values without quotes around them:



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.txt"

# check if the output file already exists. delete it if it does.
if (Test-Path -Path $outputFile -PathType Leaf) {
Remove-Item -Path $outputFile -Force -ErrorAction SilentlyContinue
}

# if you DO want headers in this file, uncomment the next line:
# Add-Content -Path $outputFile -Value 'Date,Hostname,Version,Config,IPv4,SubnetMask,Gateway,DNS1,DNS2,MatchDNS'

# loop through the $parsedResult array and build a line for each object in there
$parsedResult | ForEach-Object {
# create a comma delimited line and add it to the outputfile manually
# (Add-Content wil create the file if it does not exist and default)
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.Version,
$_.Config, $_.IPv4, $_.SubnetMask,
$_.Gateway, $_.DNS1, $_.DNS2, $_.MatchDNS
$newline | Add-Content -Path $outputFile -Force
}


Scenario 2

Use PowerShells Export-Csv cmdlet and output the $parsedResult array as proper CSV file. The field values will have quotes around them.



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.csv"
$parsedResult | Export-Csv -Path $outputFile -NoTypeInformation -Encoding ASCII -Delimiter ',' -Force





share|improve this answer















Ok, so if your function Parse_IP_NAS creates a file called IP_NAS_PARSED.txt that looks like this:



2018-11-07,host1-CS0,8.1.9-184,IP_INFO, 10.143.17.205, 255.255.254.0, 10.13443.16.15, 1299.493.100.1342,199.52342.1724.12341
2018-11-07,host2,8.1.9-184,IP_INFO, 101.20432.40.6512, 255.255.255.0, 130.2104.4034.1, 10.146.11.58,10.146.11.74,202343.2234.12340.37
2018-11-07,host3,8.1.9-184,IP_INFO, 120.204.430.658, 255.255.255.0, 10.20344.40.1, 10.146.11.58,10.14436.11.7234,203.2342.12340.37
2018-11-07,host4,7.1.79-8,IP_INFO, 1412.2221.89.1432, 255.255.255.0, 141232.212321.81239.254, 142.221.921.223,13499.2349.100.12
2018-11-07,host5,7.1.80-7,IP_INFO, 1452.2421.922.817, 255.255.255.0, 141232.2421.9122.2514, 142.221.119.92,142.221.119.91
2018-11-07,host6,8.1.9-155,IP_INFO, 1242.22211.92.21232, 255.255.255.0, 14232.2231.942.2524, 142.221.119.92,142.2321.1149.91
2018-11-07,host7,8.1.9-184,IP_INFO, 130.1392.423.2144, 255.255.255.0, 4210.19412.324.1, 101.14246.11.58,10.1414 62.131.744,2033.22.104.37
2018-11-07,host8,8.1.9-184,IP_INFO, 12310.12395.560.4213, 255.255.255.0, 110.191245.61240.241, 11240.12446.111.4258,1240.12446.2411.2474,20243.12.110.3427
2018-11-07,,,IP_INFO, 10.123.444.1, 25515.255.255.0, 10.195.60.1, 11230.14216.111.51248,10124.142416.14211.7424,212403.21.1240.3247
2018-11-07,host9,8.1.9-184,IP_INFO, 110.123.443.51, 255.255.255.0, 10124.11250.042.124, 11230.22312.2320.542,1042.21212.142129.2414


and all you want is code that reads that IP_NAS_PARSED.txt to do a check on the existance if the IPv4 value and append a field after each line, I think all you have to do is this AFTER the IP_NAS_PARSED.txt is created:



# read the IP_NAS_PARSED.txt created by the 'Parse_IP_NAS' function and create a comma delimited .TXT file from it with the value '$MatchDNS' appended

# check if the file "$destination_PARSE_NASIP_NAS_PARSED_3.txt" already exists. delete it if it does.
if (Test-Path -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt") {
Remove-Item -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force -ErrorAction SilentlyContinue
}

$OK = "Compliance"
$FAIL = "No-Compliance"
$csvContent = Import-Csv -Path "$destination_PARSE_NASIP_NAS_PARSED.txt" -Header @("Date","Hostname","version","Config","IPv4","SubnetMask","Gateway","DNS1","DNS2")
$csvContent | ForEach-Object {
# you can use IsNullOrEmpty() too in your case, but use 'IsNullOrWhiteSpace()' for safety if ever you decide to quote the values.
if ([string]::IsNullOrWhiteSpace($_.IPv4)) {
$color = 'Red'
$MatchDNS = $FAIL
}
else {
$color = 'Green'
$MatchDNS = $OK
}

# create a comma delimited line and show it in the console
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.version, $_.Config, $_.IPv4, $_.SubnetMask, $_.Gateway, $_.DNS1, $_.DNS2, $MatchDNS
Write-Host $newline -ForegroundColor $color

# and add it to file "IP_NAS_PARSED_3.txt" manually (Add-Content wil create the file if it does not exist)
$newline | Add-Content -Path "$destination_PARSE_NASIP_NAS_PARSED_3.txt" -Force
}


Note: this code follows your function Parse_IP_NAS and is not meant to be inside that function.





EDIT



Maybe it is even a better idea to redo the Parse_IP_NAS function a bit, so we can streamline the parsing more efficiently and we don't need any 'in-between' files.



Just a thought, but how about this:



function Parse_IP_NAS {
[CmdletBinding(DefaultParameterSetName = 'ByContent')]
Param(
[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByContent')]
[string]$Content,

[Parameter(Position = 0, Mandatory = $true, ParameterSetName = 'ByFileName')]
[ValidateScript({Test-Path -Path $_ -PathType Leaf})]
[string]$Path
)
if ($PSCmdlet.ParameterSetName -eq 'ByFileName') {
$Content = Get-Content -Path $Path -Raw
}

# create an array to store the resulting objects
$result = @()
# split the content of the "Network Information VNX" in $Content into blocks
# Each block starts with "Hostname:"
foreach ($hostBlock in ($Content -split "Hostname:")) {
# skip if we have nothing in the block
if ([string]::IsNullOrWhiteSpace($hostBlock)) { continue }

# create a PSCustomObject with these properties:
$parsedHost = '' | Select-Object 'Date','Hostname','Version','Config','IPv4','SubnetMask','Gateway','DNS1','DNS2','MatchDNS'

## I'm not sure where the Date came from.. Is that today's date?
$parsedHost.Date = (Get-Date).ToString('yyyy-MM-dd')
$parsedHost.Config = 'IP_INFO'

# split the $hostBlock textblock on newlines (r = CR, n = LF) to get an array
# loop through the lines, but skip the line 'Network:' and any possible empty or whitespace-only strings
($hostBlock -split 'r?n') | Where-Object { $_ -match 'S' -and $_ -notmatch 'Network:' } | ForEach-Object {
if ($_ -match '=') {
$value = ($_ -split '=')
switch -regex ($value[0]) {
'IPv4 Address' { $parsedHost.IPv4 = $value[1].Trim() }
'IPv4 Netmask' { $parsedHost.SubnetMask = $value[1].Trim() }
'IPv4 Gateway' { $parsedHost.Gateway = $value[1].Trim() }
'DNS Servers' { $parsedHost.DNS1, $parsedHost.DNS2 = ($value[1] -split ',') | ForEach-Object { $_.Trim()}}
}
}
else {
$parsedHost.Hostname, $parsedHost.Version = ($_ -split ',') | ForEach-Object { $_.Trim() }
}
}

# now check if the IPv4 value is set for this host
if ([string]::IsNullOrWhiteSpace($parsedHost.IPv4)) {
$color = 'Red'
$parsedHost.MatchDNS = 'No-Compliance' # $FAIL
}
else {
$color = 'Green'
$parsedHost.MatchDNS = 'Compliance' # $OK
}

# add the object to the $result array
$result += $parsedHost

# add some visual output to the console
$message = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $parsedHost.Date, $parsedHost.Hostname, $parsedHost.Version,
$parsedHost.Config, $parsedHost.IPv4, $parsedHost.SubnetMask,
$parsedHost.Gateway, $parsedHost.DNS1, $parsedHost.DNS2, $parsedHost.MatchDNS
Write-Host $message -ForegroundColor $color
}
return $result
}


Now you can execute the Parse_IP_NAS function to use either parameter 'Content' if you already have the content in a string variable like:



$parsedResult = Parse_IP_NAS -Content $ParseFileIP


Or feed it the full path and name of the file so it will read the content for you:



$parsedResult = Parse_IP_NAS -Path '<path to the Network Information VNX file>'


After this call to the function, we have an array of objects with all values for each host found in $parsedResult as objects, so this is where you choose what to do with this info:



Scenario 1

Create the output manually so it will become a file of comma delimited values without quotes around them:



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.txt"

# check if the output file already exists. delete it if it does.
if (Test-Path -Path $outputFile -PathType Leaf) {
Remove-Item -Path $outputFile -Force -ErrorAction SilentlyContinue
}

# if you DO want headers in this file, uncomment the next line:
# Add-Content -Path $outputFile -Value 'Date,Hostname,Version,Config,IPv4,SubnetMask,Gateway,DNS1,DNS2,MatchDNS'

# loop through the $parsedResult array and build a line for each object in there
$parsedResult | ForEach-Object {
# create a comma delimited line and add it to the outputfile manually
# (Add-Content wil create the file if it does not exist and default)
$newline = '{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}' -f $_.Date, $_.Hostname, $_.Version,
$_.Config, $_.IPv4, $_.SubnetMask,
$_.Gateway, $_.DNS1, $_.DNS2, $_.MatchDNS
$newline | Add-Content -Path $outputFile -Force
}


Scenario 2

Use PowerShells Export-Csv cmdlet and output the $parsedResult array as proper CSV file. The field values will have quotes around them.



$outputFile = "$destination_PARSE_NASIP_NAS_PARSED_COMPLETE.csv"
$parsedResult | Export-Csv -Path $outputFile -NoTypeInformation -Encoding ASCII -Delimiter ',' -Force






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 15 '18 at 14:26

























answered Nov 14 '18 at 15:51









TheoTheo

4,8062520




4,8062520













  • @Agustinlacorazza I have added some more code in my answer with an alternative Parse_IP_NAS function. It is just an idea I had to maybe streamline things a bit. Cheers!

    – Theo
    Nov 15 '18 at 14:29



















  • @Agustinlacorazza I have added some more code in my answer with an alternative Parse_IP_NAS function. It is just an idea I had to maybe streamline things a bit. Cheers!

    – Theo
    Nov 15 '18 at 14:29

















@Agustinlacorazza I have added some more code in my answer with an alternative Parse_IP_NAS function. It is just an idea I had to maybe streamline things a bit. Cheers!

– Theo
Nov 15 '18 at 14:29





@Agustinlacorazza I have added some more code in my answer with an alternative Parse_IP_NAS function. It is just an idea I had to maybe streamline things a bit. Cheers!

– Theo
Nov 15 '18 at 14:29


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53288573%2fissue-output-the-same-line-over-and-over%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Full-time equivalent

Bicuculline

さくらももこ