3

Rename-Item 接受一个脚本块(我认为......)作为参数,所以如果我想重命名一堆文件(例如),我可以这样做:

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

我正在编写一个 cmdlet 来重命名某些项目,并且希望能够将这样的语法用于新名称,但是如何声明参数以接受这样的脚本块或简单的字符串?

4

2 回答 2

4

如果您正在编写基于 .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);
}
于 2009-09-03T23:25:47.400 回答
3

是的。-NewName 需要一个脚本块。试试这个:

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

  dir *.ps1| Rename-Item -NewName $sb
}
于 2009-09-03T17:00:10.963 回答