Rename-Item接受一個scriptblock(我認爲...)作爲參數,所以我可以做這樣的事情,如果我想重命名一堆文件(例如):編寫一個PowerShell cmdlet接受一個腳本塊作爲參數
Dir *.ps1 | Rename-item -NewName {$_.Name -replace ".ps1" ".txt" }
我正在寫一個cmdlet來命名一些項目,並希望能夠使用的語法喜歡本作的新名字,但如何聲明參數接受這樣或腳本塊簡單字符串?
Rename-Item接受一個scriptblock(我認爲...)作爲參數,所以我可以做這樣的事情,如果我想重命名一堆文件(例如):編寫一個PowerShell cmdlet接受一個腳本塊作爲參數
Dir *.ps1 | Rename-item -NewName {$_.Name -replace ".ps1" ".txt" }
我正在寫一個cmdlet來命名一些項目,並希望能夠使用的語法喜歡本作的新名字,但如何聲明參數接受這樣或腳本塊簡單字符串?
如果你正在編寫一個基於.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);
}
是的。 -NewName需要一個腳本塊。試試這個:
Function Do-MyRename {
param([ScriptBlock]$sb)
dir *.ps1| Rename-Item -NewName $sb
}
是的,這就是我想做的事 - 如果重命名,項目設置參數爲管道綁定這是配不上我。 – 2009-09-04 10:25:40
如何知道在這種情況下可以使用ScriptBlocks?我認爲這會比使用ForEach命令進行封裝的時候帶來更少的開銷? – Josh 2012-05-18 14:22:49
@JoshEinstein我認爲這不是開銷。運行一個或多個cmdlet開始/處理/結束。 – 2012-05-18 15:04:29