簡體   English   中英

編寫PowerShell cmdlet以接受腳本塊作為參數

[英]Writing a PowerShell cmdlet to accept a scriptblock as a parameter

Rename-Item接受一個腳本塊(我認為...)作為參數,因此如果我想重命名一堆文件(例如),我可以執行以下操作:

Dir *.ps1 | Rename-item -NewName {$_.Name -replace ".ps1" ".txt" }

我正在編寫一個cmdlet來重命名某些項,並且希望能夠對新名稱使用這樣的語法,但是如何聲明參數來接受這樣的腳本塊或簡單的字符串?

如果要編寫基於.NET的cmdlet(C#/ VB),請記住,任何與管道綁定的參數都將自動支持腳本塊。 那只是PowerShell的一項功能。 但是,如果您要使用的參數不受管道限制,則可以執行以下操作:

[Parameter]
public ScriptBlock NewName { get; set; }

[Parameter(ValueFromPipeline = true)]
public string OldName { get; set; }

protected override void ProcessRecord()
{
    Collection<PSObject> results = NewName.Invoke(this.OldName);
    this.Host.UI.WriteLine("New name is " + results[0]);
}

對於這種方法,我唯一不喜歡的是您不能在腳本塊中使用$ _,在這種情況下必須使用$ args [0]。 也許有更好的方法可以做到這一點,並且有人會喜歡上它。

OTOH,Rename-Item確實將NewName參數指定為受屬性名稱約束的管道。 在這種情況下,只需將NewName參數設置為所需的類型(字符串),然后讓PowerShell執行腳本魔術。 最棒的是,在這種情況下,$ _在腳本塊中有效,例如:

[Parameter(ValueFromPipelineByPropertyName = true)]
public string NewName { get; set; }

[Parameter(ValueFromPipeline = true)]
public string OldName { get; set; }

protected override void ProcessRecord()
{
    this.Host.UI.WriteLine("New name is " + this.NewName);
}

是。 -NewName使用腳本塊。 嘗試這個:

Function Do-MyRename {
  param([ScriptBlock]$sb)

  dir *.ps1| Rename-Item -NewName $sb
}

暫無
暫無

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

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