2017-12-03 111 views
1

這裏是我正在嘗試使用的測試腳本,我從一個單獨的進程調用它並嘗試將參數傳遞給它。這個想法是,我有一個用戶界面,允許用戶選擇一個CmdLet,然後用該CmdLet的屬性/方法填充另一個下拉列表。是否可以使用cmdlet作爲動態PowerShell腳本的輸入參數?

我的問題似乎是,腳本將輸入參數呈現爲一個字符串,並且因此正在創建一個文本文件,其中包含您應用「Get-Member」的任意任意字符串的方法和屬性如「克隆」或「CompareTo」。唯一的財產是「長度」。

有沒有辦法讓輸入參數作爲可用的CmdLet而不是字符串?也許我錯過了一些東西,或許我試圖做的事情是不可能的。

param([string]$inputCmdLet = "Get-NetAdapter"); 

$wrkgDir = "D:\Distribution\Operational"; 

# Get Properties and Methods for CmdLet Input Parameter 
$propertyNames = $inputCmdLet | Get-Member -MemberType Property; 
$methodNames = $inputCmdLet | Get-Member -MemberType Method; 

# Sort Arrays 
$propertyNames = $propertyNames | Sort-Object Name; 
$methodNames = $methodNames | Sort-Object Name; 

# Output Results to Text Files 
$propertyNames.Name | Out-File $wrkgDir\$inputCmdLet.Properties.txt; 
$methodNames.Name | Out-File $wrkgDir\$inputCmdLet.Methods.txt; 

編輯更多信息:

輸出我希望的,在獲取-NetAdapter的例子,是其他同一個輸出文件的屬性和方法的列表。現在做什麼我得到的是:

Left list is expected (partial) result, right list is actual result.

我不確定如何實現左邊的結果列表(圖中)編程。我可以通過鍵入了靜態來獲取正確的輸出:

$mbrNameStatic = Get-NetAdapter | Get-Member; 
$mbrNameStatic.Name | Out-File $wrkgDir\$inputCmdLet.Strings.txt; 

但是當我使用的輸入參數,它在合併爲一個字符串值,如此看來實際運行時代碼看起來更像是這個:

$propertyNames = "Get-NetAdapter" | Get-Member -MemberType Property; 

所以加引號的呈現cmdlet將作爲字符串(很有道理我想,因爲我的輸入參數是一個字符串),它返回的屬性和一個字符串,而不是cmdlet的方法。有沒有辦法讓cmdlet不用引號渲染出來?

請讓我知道,如果我沒有理解這個,無論是我的描述,還是完全的想法。

謝謝!

+1

你描述的是'顯示,Command' cmdlet的做什麼。它顯示一個cmdlet的用戶界面。是否有理由重寫內置cmdlet?或者'Get-Command'可用於檢索代表基於名稱的給定cmdlet,函數或腳本的對象。 –

+0

嗨@mikez,謝謝你的迴應。我試圖實現的目的是爲不熟悉PowerShell或腳本的用戶提供易用性。這個想法是將這個功能包裝到現有的多用途UI中,但是提供可擴展性和可重用的代碼。我應該如何在我的情況下使用Get-Command?我試過這個: param([string] $ inputCmdLet =「Get-NetAdapter」); $ targetCmdLet = Get-Command $ inputCmdLet; 但是,唉,這沒有得到我輸入的cmdlet的成員屬性和方法。謝謝! – africo

回答

0

爲了執行其(只)被存儲在一個變量或名字以單或雙引號中指定的命令,你必須使用&,該電話運營商

# WRONG: The token is interpreted as an *expression* that outputs a *string* 
"Get-NetAdapter" # outputs the [string] literal 

# WRONG: ditto, via a variable 
$name = "Get-NetAdapter" 
$name # outputs the contents of the [string] variable 

# OK: Use of & tells Powershell to interpret the next token as a *command* to *invoke*. 
& "Get-NetAdapter" 
& $name 

至於你的一般方法:

  • 注意,不帶參數調用時不是所有的cmdlet產生的輸出,所以你當前的代碼(即使&)將無法正常工作與所有cmdlet一起使用。

  • 相反,那些服用時不產生輸出的cmdlet沒有參數可能會產生很多人,這是不必要的,因此可以考慮像& $inputCmdlet | Select-Object -First 1

  • 一般地,你可以使用像(Get-Command Get-NetAdapter).OutputType獲得cmdlet的輸出類型,但要注意的是:

    • 聲明的輸出類型是可選,所以不是所有的cmdlet可能會返回一個值。

    • 如果你開始與比該類型的實例一個評價人,你不能使用Get-Member來發現實例成員(你只能通過-Static獲得靜態成員)。

+1

&符號做了詭計。這仍然是一個想法正在形成,所以我期待遇到像你所描述的警告。我仍然對PowerShell不熟悉,並且缺乏像這樣的一些基礎知識;我認爲這可能是一件簡單的事情,但我並不瞭解。非常感激! – africo

相關問題