在重命名,项目接受脚本块(我想...)作为参数,所以我可以做这样的事情,如果我要重命名一批文件(例如)的:

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,重新命名 - 项目确实指定新名称参数作为管道由属性名的约束。在这种情况下,你只是使新名称参数是你想要的类型(字符串),并让PowerShell中做脚本块魔力。最重要的是,在这种情况下,$ _作品在脚本块e.g:

[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归因
不隶属于 StackOverflow
scroll top