パラメータとしてスクリプトブロックを受け入れるためのPowerShellコマンドレットを書きます

StackOverflow https://stackoverflow.com/questions/1374451

  •  21-09-2019
  •  | 
  •  

質問

私は(例えば)ファイルの束の名前を変更したい場合、私はこのような何かを行うことができますので、名前の変更、項目をパラメータとして(と思う...)スクリプトブロックを受け入れます:

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

私はいくつかの項目の名前を変更するコマンドレットを書いているし、新しい名前のために、このような構文を使用できるようにしたいと思いますが、このようなスクリプトブロックまたは単純な文字列?

役に立ちましたか?

解決

あなたは、.NETベースのコマンドレット(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]を使用する必要がスクリプトブロックで$ _を使用できないということです。おそらく、そこにこれを行うには良い方法があると誰かがそれでチャイムされます。

大藤、名前の変更、項目は、プロパティ名に縛らパイプラインとしてこの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
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top