2017-05-09 82 views
2

我遇到了一個奇怪的問題,我不知道如何解釋。我希望有人能爲我揭開一些光。PowerShell管道參數問題

我想創建一個函數,它接受一個數組的參數,假設$輸出scriptnames和用戶有一個選項,從以前的結果,他們應該更喜歡管吧。我剝去了不相關的東西,以更好地說明我的困惑。

在模塊的過程中,我從數組中讀取每個項目,然後打印項目。

我的功能:

function Get-Test 
{ 
[CmdletBinding()] 
param 
(
[parameter(mandatory=$true, 
      ValueFromPipeline=$True, 
      ValueFromPipelineByPropertyName=$true)] 
    [string[]]$scriptNames 
) 
    BEGIN 
    { 
    } 
    PROCESS 
    { 
    foreach ($scriptName in $scriptNames) 
    { 
     Write-Verbose "Executing: $scriptname" 
    }  
    } 
    END{} 

這裏是什麼讓我感到困惑:

方案1:

我用這個命令來獲取我的目錄中的文件列表:

get-childitem | Select-Object {$_.BaseName} 

文件的列表是正確返回沒有擴展名:

enter image description here

然而,當我用管道輸送的結果,我的功能,我得到這個打印出來:

enter image description here

通知不必要的$ _.BaseName =文字被添加。

方案2:

但是,如果我發出此命令:

get-childitem | Select-Object $_.BaseName 

結果並沒有真正篩選出的基本部分僅

enter image description here

但當管道到我的功能:

get-childitem | Select-Object $_.BaseName| 
Get-Test -Verbose 

的$ _basename文字是不包括:

enter image description here

然而,基名包括擴展,這真的讓我感到困惑。

有人能看到的東西,在你燃燒嗎?以及爲什麼會發生以下事情

1)爲什麼$ _。BaseName文字標記在腳本1的打印輸出中,我沒有要求?

2)似乎爲什麼不選擇在方案2的工作,但打印出來沒有$ _。baseName的完全相同的腳本?

3)我需要在腳本中更正哪些內容才能打印出文件名,而不帶擴展名,也沒有文字$ _。BaseName?

+0

'選擇 - 對象{$ _基礎名稱。}' - >'的foreach對象{$ _基礎名稱}' – PetSerAl

回答

3

:獲得一個綁定錯誤。將其切換爲Select-Object -ExpandProperty BaseName即可完成要查找的內容,也可以使用(Get-ChildItem).BaseName獲得相同的結果。

每當您看到預期爲某個字符串的東西(即Filename)時,它將返回爲對象/散列表(即@{$_.BaseName=Filename})。如果你想讓它返回擴展名,請使用Name而不是BaseName。如果你想要文件的完整路徑,在這種情況下使用FullName

要回答你的問題的情況...

  1. 其行爲符合預期,因爲你只指定從對象返回一個屬性,但仍返回對象。對象屬性名爲$_.BaseName,因爲您是這樣定義它的方式(通常您只需指定屬性名稱,而不包括前面的$_.以指示管道對象,即Select-Object BaseName)。它也在工作,因爲方案1中的周圍花括號內容爲:

  2. 即使您將完整對象傳遞給它,詳細文本似乎默認爲Name屬性。方案2中的第一個示例返回完整對象,因爲您錯誤地調用了Select-Object。

  3. 我最初的答案應該覆蓋的解決方案,我認爲

+0

太棒了!這解釋了它!非常感謝你! – user1205746

0

你沒有指定要如何調用你的函數,所以真的不能告訴什麼地方錯了#1,好像你正在返回字符串

#的數組,而不是2很容易。你應該簡單地寫下

gci |select-object basename 

而不是$ _。basename。

#3可能與2

另外,如果你想獲得基名不使用選擇,對象和不想要的標題。你可以代替辦:

(get-childitem).basename | whatever 

這裏是如何使用您在上面

PS C:\> (gci).basename |get-test -ver 
VERBOSE: Executing: batch 
VERBOSE: Executing: DB 
VERBOSE: Executing: Modules 
VERBOSE: Executing: nix 
VERBOSE: Executing: py 
VERBOSE: Executing: utils 
VERBOSE: Executing: Microsoft.PowerShellISE_profile 
VERBOSE: Executing: Microsoft.PowerShell_profile 
VERBOSE: Executing: PowerShellTranscripts 

提供的實例函數打印哦,你真的應該刪除強制性,如果您期望管的東西,或者你會如果包括Select-Object BaseName,您返回對象的數組1個屬性,BaseName

Get-Test : Cannot bind argument to parameter 'scriptNames' because it is an empty string 
+0

我創造了它作爲一個模塊,放在模塊應該被放置並被PS識別的地方,然後我使用Import-Module加載模塊。我也試着加載它使用。 。\ myFunction.ps1,它仍然具有相同的行爲。我認爲這個問題可能存在於腳本中,而不是腳本如何加載。但是,我是PS新手,所以我可能會做一些我不想做的事情。 – user1205746

+0

我嘗試使用basename而不是$ _。basename,它仍然在做同樣的事情......怪異的.. – user1205746

+0

我想你誤會了。我指的是你稱之爲功能的「線路」。這條線是什麼?選擇對象{$ _。BaseName} | your_func?。無論如何,您不應該使用{$ _。baseline}或$ _。baseline。使用我提到的最後一行aboe,並把你的函數名稱代替'whatever'。看看是否有助於錯誤 –