2009-09-03 51 views
3

Rename-Item接受一個scriptblock(我認爲...)作爲參數,所以我可以做這樣的事情,如果我想重命名一堆文件(例如):編寫一個PowerShell cmdlet接受一個腳本塊作爲參數

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

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

回答

4

如果你正在編寫一個基於.NET的cmdlet的(C#/ VB),那麼請記住,這是管道勢必將自動支持scriptblocks任何參數。這只是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); 
} 
+0

是的,這就是我想做的事 - 如果重命名,項目設置參數爲管道綁定這是配不上我。 – 2009-09-04 10:25:40

+0

如何知道在這種情況下可以使用ScriptBlocks?我認爲這會比使用ForEach命令進行封裝的時候帶來更少的開銷? – Josh 2012-05-18 14:22:49

+0

@JoshEinstein我認爲這不是開銷。運行一個或多個cmdlet開始/處理/結束。 – 2012-05-18 15:04:29

3

是的。 -NewName需要一個腳本塊。試試這個:

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

    dir *.ps1| Rename-Item -NewName $sb 
} 
相關問題