问题
I'm quite new to PS, so please don't kill me if the resolution is so easy :) I've tried to find a solution here and in google, but no luck.
This is part of code which don't work as I want
$Contents = Get-Content "Path\test.txt"
foreach($Line in $Contents) {
$Line = $Line.split(":")[1]
$s = $line -split ':'
$RegPath = $s[0]
$Value_Name = $s[1]
$Type = $s[2]
$Value = $s[3]
Write-host $RegPath $Value_Name $Type $Value
}
The output from Write-Host
is ok, but the main problem is when I want to use those variables after end of foreach
loop. If I call any variable after foreach
, for example Write-Host $Value_Name
it is just empty.
I need to use those variables $RegPath, $Value_Name, $Type, $Value
in later code of script. I can't figure how to do it. I would appreciate any help/idea how to do it. Thank you in advance
EDIT: Added test.txt
Just some text to ignore :Software\Test
Just some text to ignore :Test
Just some text to ignore :String
Just some text to ignore :Value
And the output from the first Write-Host in foreach is correct
Software/Test
Test
String
Value
And when I want to use for example just $Value_Name
, the output is empty after foreach
回答1:
There is a misconception:
- while iterating the ForEach each
$Line
is split and returns a single item. $s[0..3] would only be populated if there were at least three colons in the same Line. - Provided you want to assign the colon separated values of the first 4 lines to these variables, try this
$Contents = Get-Content "Path\test.txt"
$RegPath = $Contents[0].split(":")[1]
$Value_Name = $Contents[1].split(":")[1]
$Type = $Contents[2].split(":")[1]
$Value = $Contents[3].split(":")[1]
Write-host ("{0}|{1}|{2}|{3}" -f $RegPath,$Value_Name,$Type,$Value)
Sample output
Software\Test|Test|String|Value
回答2:
Edit: changing the answer due to misunderstanding of file format. Will leave it here as it might be helpful for someone in the future.
Before the loop use:
$outputFromLoop = @()
And in the loop use:
foreach ($Line in $Contents) {
# Here goes your code and variables RegPath, Value_Name, Type, Value are assigned
# Add this:
$object = New-Object –TypeName PSObject
$object | Add-Member –MemberType NoteProperty –Name "RegPath" –Value $RegPath
$object | Add-Member –MemberType NoteProperty –Name "Value_Name" –Value $Value_Name
$object | Add-Member –MemberType NoteProperty –Name "Type" –Value $Type
$object | Add-Member –MemberType NoteProperty –Name "Value" –Value $Value
$outputFromLoop += $object
}
Now you can list all the values:
$outputFromLoop
Or just access any element by index:
$outputFromLoop[0]
Properties can be accessed like this:
$outputFromLoop[0].RegPath
$outputFromLoop[0].Value_Name
$outputFromLoop[0].Type
$outputFromLoop[0].Value
Test the output:
Write-Host $outputFromLoop[0].RegPath $outputFromLoop[0].Value_Name $outputFromLoop[0].Type $outputFromLoop[0].Value
Short explanation
What you basically do here is to create custom object $object
for each $Line
and add this to $outputFromLoop
array. Once you finish ForEach
loop you can access any element and its property based on the examples below the code.
回答3:
You could create hashtables and "save" them in an array
$Contents = Get-Content "Path\test.txt"
$list = @()
foreach($Line in $Contents) {
$Line = $Line.split(":")[1]
$s = $line -split ':'
$RegPath = $s[0]
$Value_Name = $s[1]
$Type = $s[2]
$Value = $s[3]
Write-host $RegPath $Value_Name $Type $Value
$list += @{Regpath=$Regpath;Name=$Value_Name;Type=$Type;Value=$Value}
}
There are other possibilities like a two dimensional array for example.
回答4:
after the loop you'll have just the last values, because your variables are receveing and override the previous values. You need to do all things insde the loop. Each interation are one set of values.
$Contents = Get-Content "Path\test.txt"
foreach($Line in $Contents) {
$Line = $Line.split(":")[1]
$s = $line -split ':'
$RegPath = $s[0]
$Value_Name = $s[1]
$Type = $s[2]
$Value = $s[3]
Write-host $RegPath $Value_Name $Type $Value
# do here the operations
}
来源:https://stackoverflow.com/questions/50875649/powershell-reading-multiple-variables-from-text-file