写一个PowerShell命令接受一个脚本块作为参数
-
21-09-2019 - |
题
在重命名,项目接受脚本块(我想...)作为参数,所以我可以做这样的事情,如果我要重命名一批文件(例如)的:
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
}
不隶属于 StackOverflow