从[string]解析输入参数值对的本机机制

时间:2014-12-24 03:09:27

标签: parsing powershell

是否存在使用与cmdlet参数相同的规则自动将控制台输入解析为变量的本机内置构造?

例如,许多cmdlet以-parameter1 unspaced-value1 -parameter2:"spaced value2"

的形式接受参数值对

我想使用可能Read-Host读取字符串,然后将字符串解析为参数值对并将它们存储到$variables中,类似于int main(argv, argc),但可能是关联的数组或类似的东西。

1 个答案:

答案 0 :(得分:4)

不确定我是否完全理解你想要什么,但你肯定在描述一个哈希表,可以简单地定义为

@{Name="Value";AnotherName="AnotherValue"}

或更具可读性

@{
    Name="Value"
    AnotherName="AnotherValue"
}

两者都会输出以下内容,这些内容可以分配给一个可用于splatting的变量(稍后会详细介绍)

Name        Value       
----        -----       
Name        Value       
AnotherName AnotherValue

好的,那很好,但是你正在寻找一种方法来使用这个特殊的Read-Host呢?这可能是ConvertFrom-StringData节省一天的地方。用它最简单的形式:

PS C:\Users\Cameron> $data = "Data=Awesome"

PS C:\Users\Cameron> $data | ConvertFrom-StringData

Name                           Value                                                                                                                                        
----                           -----                                                                                                                                        
Data                           Awesome          

好的......那很棒......但Read-Host怎么样?我们现在试试吧!

PS C:\Users\Cameron> Read-Host | ConvertFrom-StringData
Something=Blah

Name                           Value                                                                                                                                        
----                           -----                                                                                                                                        
Something                      Blah     

如果您想要执行多个键/值对,这可能会变得复杂,因为Read-Host似乎不喜欢在提示中插入新行。要作弊,我使用-Split-Join。拆分拆分对并加入最终创建换行符分隔的字符串ConvertFrom-StringData更好地播放。 旁注有一篇帖子有一个用于创建multiline input from Read-Host的代码段,但这更简单。

PS C:\Users\Cameron> ((Read-Host) -Split ";") -Join "`r`n" | ConvertFrom-StringData
Key1=Value1;Key2=Value2;Key3=Value3  <---- That is what I typed in as a response to Read-Host 

Name                           Value                                                                                                                                        
----                           -----                                                                                                                                        
Key1                           Value1                                                                                                                                       
Key2                           Value2                                                                                                                                       
Key3                           Value3 

如果您还在阅读,请使用splatting并给出使用此逻辑的实际原因。

PS C:\Users\Cameron>  $results = ((Read-Host) -Split ";") -Join "`r`n" | ConvertFrom-StringData
Get-ChildItem @results

Filter=*.txt;Path=C:\\temp    <---- That is what I typed in as a response to `Read-Host`                                                                                                                                    

LastWriteTime : 10/22/2014 11:43:38 PM
Length        : 653018
Name          : out1.txt

....output truncated....

注意:您应该注意我在第二个反斜杠Path=C:\\temp中输入的路径。原因来自TechNet的ConvertFrom-StringData

文章
  

ConvertFrom-StringData支持转义字符序列   传统的机器翻译工具允许。也就是说,cmdlet   可以将反斜杠(\)解释为字符串数据中的转义字符   使用Regex.Unescape方法,而不是Windows PowerShell   反引号字符(`),通常表示一行的结尾   一个脚本。在here-string中,反引号字符没有   工作。您还可以在结果中保留文字反斜杠   使用前面的反斜杠转义它,如下所示:\\。非转义   反斜杠字符,例如文件中常用的字符   路径,可以在结果中呈现为非法转义序列。

小更新

虽然((Read-Host) -Split ";") -Join "`r`n" | ConvertFrom-StringData有效,但我确信以下内容要简单得多。

(Read-Host).Replace(";","`r`n") | ConvertFrom-StringData