有一个包含此内容的文件
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)
答案 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
之类的内容可能首先适合于从文件中读取命令。