簡體   English   中英

Powershell的管道參數問題

[英]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

要回答您的方案問題...

  1. 這樣做的行為與預期的一樣,因為您僅指定了要從對象返回的單個屬性,但仍在返回對象。 對象屬性被命名為$_.BaseName因為您使用調用它的方式定義了它(通常,您只需指定屬性名稱,而無需在前面包含$_.即可指示管道對象,即Select-Object BaseName )。 由於場景1中周圍的花括號,它也起作用了

  2. 即使將完整的對象傳遞給它,冗長的文本似乎仍默認為Name屬性。 方案2中的第一個示例將返回完整對象,因為您未正確調用Select-Object。

  3. 我認為我的最初答案應該涵蓋解決方案

您沒有指定如何調用函數,因此無法真正分辨#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM