Powershell reading multiple variables from text file

拈花ヽ惹草 提交于 2021-02-08 10:20:16

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!