0

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

4
  • Can you post a sample of what is in 'test.txt'? It looks like you might be using colon-separated values, which means that Import-Csv -Delimiter ":" might be an option. Commented Jun 15, 2018 at 12:34
  • It would be much easier to follow your code if you edit your question to contain a sample line of your file "Path\test.txt" Commented Jun 15, 2018 at 12:35
  • Edited main post Commented Jun 15, 2018 at 12:38
  • IMO the Just some text to ignore : is impotant to identify the lines, to not just rely on the order. Commented Jun 15, 2018 at 13:34

4 Answers 4

4

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
Sign up to request clarification or add additional context in comments.

1 Comment

Brilliant. Works perfectly and thanks for a explanation!
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.

7 Comments

Almost perfect. But the most important thing $outputFromLoop[0].RegPath $outputFromLoop[0].Value_Name $outputFromLoop[0].Type $outputFromLoop[0].Value is empty. Tried to change index but still without luck. The previous outputs work correctly, but the "view" of it is unusable for me
I added Write-Host to my answer, can you check? Tested on my side.
Write-Host just returned me only Software\Test
Check LotPings answer, that explains a lot. Does your file contains only these 4 lines or more? I'll change my script to cover it.
I think you're better of changing the inputfile from a text file with 4 values on separate lines to a proper .CSV file where you can store multiple reg properties under a heading of "RegPath","Value_Name","Type","Value". Easy to maintain and easy to load with Import-Csv
|
1

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.

Comments

0

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
}

1 Comment

Thanks, but this doesn't make me happy, because this is just a small part of bigger script and I need to use those 4 variables in later use. That's why I'm trying to figure out how to do it. The foreach loop is just to put strings in variables for later use

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.