Rename-Item 接受一个脚本块(我认为......)作为参数,所以如果我想重命名一堆文件(例如),我可以这样做:
Dir *.ps1 | Rename-item -NewName {$_.Name -replace ".ps1" ".txt" }
我正在编写一个 cmdlet 来重命名某些项目,并且希望能够将这样的语法用于新名称,但是如何声明参数以接受这样的脚本块或简单的字符串?
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
}