[英]Piping parameter issue with 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}
文件列表已正確返回,沒有擴展名:
但是,當我將結果通過管道傳遞給函數時,我得到了以下打印內容:
注意,添加了不需要的$ _。BaseName =文字。
方案2:
但是,如果我發出以下命令:
get-childitem | Select-Object $_.BaseName
結果並沒有真正僅過濾掉基名
但是當管道到我的職能:
get-childitem | Select-Object $_.BaseName|
Get-Test -Verbose
$ _basename文字不包括在內:
但是,基本名稱包括擴展名,這確實讓我感到困惑。
有人可以看到你身上冒出什么東西嗎? 以及為什么發生以下情況 :
1)為什么在方案1的打印輸出中標記了$ _。BaseName文字,我沒有要求?
2)為什么選擇似乎在方案2中不起作用,但是打印輸出沒有$ _。baseName具有完全相同的腳本?
3)我需要在腳本中更正什么才能僅輸出不帶擴展名且不帶文字$ _。BaseName的文件名?
當包含Select-Object BaseName
,將返回具有1屬性BaseName
的對象數組。 將其切換到Select-Object -ExpandProperty BaseName
即可執行所需的操作,也可以使用(Get-ChildItem).BaseName
來獲得相同的結果。
每當您看到期望作為字符串(即Filename
)的東西,而是將其作為對象/哈希表(即@{$_.BaseName=Filename}
)返回時。 如果要讓它也返回擴展名,請使用Name
而不是BaseName
。 如果您需要文件的完整路徑,請在這種情況下使用FullName
。
要回答您的方案問題...
這樣做的行為與預期的一樣,因為您僅指定了要從對象返回的單個屬性,但仍在返回對象。 對象屬性被命名為$_.BaseName
因為您使用調用它的方式定義了它(通常,您只需指定屬性名稱,而無需在前面包含$_.
即可指示管道對象,即Select-Object BaseName
)。 由於場景1中周圍的花括號,它也起作用了
即使將完整的對象傳遞給它,冗長的文本似乎仍默認為Name屬性。 方案2中的第一個示例將返回完整對象,因為您未正確調用Select-Object。
我認為我的最初答案應該涵蓋解決方案
您沒有指定如何調用函數,因此無法真正分辨#1的問題,似乎您正在返回數組而不是字符串
#2很容易。 你應該簡單地寫
gci |select-object basename
而不是$ _。basename。
#3可能與2。
另外,如果您嘗試獲取基本名稱並且不希望使用標頭,則不要使用Select-Object。 您可以改為:
(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
哦,如果您希望將內容強制傳遞給它,則應該刪除Mandatory,否則會出現綁定錯誤:
Get-Test : Cannot bind argument to parameter 'scriptNames' because it is an empty string
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.