2014-12-24 9 views
2

是否有一個本地內置構造,​​它使用與cmdlet參數相同的規則自動將控制檯輸入分析爲變量?從[字符串]解析輸入參數值對的本地機制

例如,許多cmdlet接受-parameter1 unspaced-value1 -parameter2:"spaced value2"形式的參數值對。

我想讀的使用也許Read-Host一個字符串,然後解析字符串爲參數值對,並將其存儲到$variables,像int main(argv, argc),但也許在關聯數組或類似的東西。

+0

你只是說像一個hastable? '@ {名稱=「值」}' – Matt

+0

阿散列表是在PowerShell中,是的,@馬特主要關聯數組。 –

回答

4

不知道如果我理解你想要的是什麼,但你肯定描述,可以簡單地定義爲

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

或者更可讀

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

雙方將輸出一個哈希表如下這可以被分配給一個變量,它可用於splatting(稍後更多)

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

好的,這很好,但你正在尋找一種方式來使用這個adhoc與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支持逃脫被 允許通過傳統機器翻譯工具的字符序列。也就是說,在使用Regex.Unescape方法的字符串數據 轉義字符的cmdlet的 可以解釋反斜槓(\),而不是在Windows PowerShell 反引號字符(`),通常會發出信號線的末端, 腳本。在這裏字符串裏面,倒勾字符不是 工作。您還可以通過 保存在您的結果反斜線與前面的反斜線,這樣逃了:\\。非轉義 反斜槓字符,如那些通常在文件 路徑使用,可以在搜索結果呈現爲非法轉義序列。

小更新

雖然((Read-Host) -Split ";") -Join "`r`n" | ConvertFrom-StringData作品我敢肯定,下面就簡單多了。

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