簡體   English   中英

接受管道輸入的 PowerShell 腳本?

[英]PowerShell script that accepts pipeline input?

需要一些幫助來調整這個將最新文件復制到另一個文件夾的腳本:

$FilePath        = "C:\Downloads\Sales 202112*.xlsx"
$DestinationPath = "C:\myFiles\"

gci -Path $FilePath -File | 
  Sort-Object -Property LastWriteTime -Descending | 
    Select FullName -First 1 |
      Copy-Item $_ -Destination $DestinationPath 

不確定如何為 Copy-Item 命令引用管道輸入。

謝謝。

tl;博士

Get-ChildItem -Path $FilePath -File |
  Sort-Object -Property LastWriteTime -Descending | 
    Select-Object -First 1 | # Note: No 'FullName'
      Copy-Item -Destination $DestinationPath # Note: No '$_'

最簡單和最可靠的方法是pipe Get-ChildItem / Get-Item output按原樣綁定到其他文件處理 cmdlet ,它綁定到后者的-LiteralPath參數,即輸入文件路徑。


至於你嘗試了什么:

  • 自動$_變量,它明確地引用了手頭的管道輸入 object,僅在傳遞給 cmdlet 的腳本塊( {... } ) 內需要(並且受支持)。

  • 通過合適的管道輸入,PowerShell 將其隱式綁定到目標 cmdlet 的管道綁定參數,在上述Copy-Item調用的情況下,該參數為-LiteralPath 換句話說:沒有必要將目標參數的值指定為參數

    • 此答案解釋了將Get-ChildItem輸出的System.IO.FileInfoSystem.IO.DirectoryInfo實例綁定到文件處理 cmdlet(例如Copy-Item )的-LiteralPath參數的機制。

    • 請注意,如果FullName不在圖片中(見下文),它確實是Copy-Item作為管道輸入接收的System.IO.FileInfo實例,因為上面的Sort-Object...Select-Object -First 1調用在不改變其類型的情況下通過它們。

  • 選擇FullName屬性以嘗試僅通過管道傳遞文件的完整路徑(作為字符串)是不必要的,更重要的是:

    • 失敗了,除非你使用-ExpandProperty FullName來確保只有屬性是 output; 沒有它,您將獲得一個具有.FullName屬性.FullName - 請參閱此答案以獲取更多信息。
    • 即使你解決了這個問題,解決方案 - 至少假設 -不如System.IO.FileInfo實例作為一個整體傳遞:僅僅字符串輸入綁定到-Path而不是-LiteralPath參數,這意味着什么是定義文字路徑被解釋為通配符表達式,這尤其會導致包含[字符的文字路徑的錯誤處理(例如c:\foo\file[1].txt )。
    • 有關如何檢查任何給定 cmdlet 的管道綁定參數的詳細信息,請參閱此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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