是否存在使用与cmdlet参数相同的规则自动将控制台输入解析为变量的本机内置构造?
例如,许多cmdlet以-parameter1 unspaced-value1 -parameter2:"spaced value2"
。
我想使用可能Read-Host
读取字符串,然后将字符串解析为参数值对并将它们存储到$variables
中,类似于int main(argv, argc)
,但可能是关联的数组或类似的东西。
答案 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