如何使用PowerShell从字符串读取特定变量?

时间:2018-11-01 22:23:57

标签: powershell input

有一个包含此内容的文件

   SomeText1

   SomeCommand -parameterName abc -login def -password geh

   SomeText2

请问您应该使用哪种PowerShell才能将数组的变量和值(例如键/值对)读入数组

 login=def
 password=geh

关于该问题的具体之处在于,登录名和密码参数的顺序可能不同,因此我需要根据已知的密钥名称找到如何定位密钥/值的方法。另外,我知道我只需要登录名和密码参数以及相关值。

非常感谢您的帮助!

P.S。我打算使用以下命令来读取文件内容,但是可以更改:

$GetFileName = "$env:userprofile\Desktop\Folder\Input.txt" 

$content = [IO.File]::ReadAllText($GetFileName)

2 个答案:

答案 0 :(得分:2)

Select-String cmdlet提供了使用正则表达式从文件中提取信息的便捷方法:

$inputFile = "$env:userprofile\Desktop\Folder\Input.txt"

# Extract the information of interest and output it as a hashtable.
# Use $ht = Select-String ... to capture the hashtable in a variable.
Select-String -Allmatches '(?<=-(login|password) +)[^ ]+' $inputFile |
  ForEach-Object {
    foreach ($match in $_.Matches) {
      @{ $match.Groups[1] = $match.Value }
    }
  }

使用示例输入,输出是单个哈希表(如果多行匹配,您将获得每一行的哈希表):

Name                           Value
----                           -----
login                          def
password                       geh
  • -AllMatches告诉Select-String在每一行中搜索多个匹配项。

  • 正则表达式'(?<=-(login|password) +)[^ ]+'捕获与参数-login-password关联的参数,同时在捕获组中捕获参数名称。

    • 请注意,正则表达式假设参数值没有嵌入空格,但这通常是用户名和密码的安全假设。
  • foreach ($match in $_.Matches)处理每个匹配项,并构造并输出哈希表(@{ ... }),该哈希表的键是捕获的参数名称,值是捕获的参数。

答案 1 :(得分:1)

您可以使用正则表达式来执行此操作。例如,下面是如何从命令字符串中提取参数和参数并将其输出为自定义对象的方法(以便以后方便操作):

$cmd = "Some-Command -ParameterOne abc -ParameterTwo def -ParameterThree geh -SwitchParameter"

[Regex]::Matches($cmd, "-(?<param>\w+) (?<arg>\w*)|-(?<param>\w+)") |
    ForEach-Object {
        [PsCustomObject]@{
            Parameter = $_.Groups['param'].Value
            Argument = $_.Groups['arg'].Value
        }
    }

输出如下:

Parameter       Argument
---------       --------
ParameterOne    abc     
ParameterTwo    def     
ParameterThree  geh     
SwitchParameter   

诸如Get-Content之类的内容可能首先适合于从文件中读取命令。