Scrivi cmdlet PowerShell per accettare uno scriptblock come parametro
-
21-09-2019 - |
Domanda
Il Rename-Item accetta uno scriptblock (credo ...) come un parametro in modo che io possa fare una cosa del genere se voglio rinominare un gruppo di file (per esempio):
Dir *.ps1 | Rename-item -NewName {$_.Name -replace ".ps1" ".txt" }
sto scrivendo un cmdlet di rinominare alcuni oggetti e vorrei essere in grado di utilizzare la sintassi come questo per il nuovo nome, ma come dichiarare il parametro di accettare un blocco di script come questo o una semplice stringa?
Soluzione
Se si sta scrivendo un cmdlet base NET (C # / VB), poi tenere presente che qualsiasi parametro che è legato gasdotto supporterà automaticamente scriptblocks. Questo è solo una caratteristica su PowerShell. Se, tuttavia, il parametro che si desidera utilizzare non è vincolato gasdotto allora si può fare questo:
[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]);
}
L'unica cosa che non mi piace di questo approccio è che non è possibile utilizzare $ _ nel scriptblock si deve utilizzare $ args [0] in questo caso. Forse c'è un modo migliore per fare questo e qualcuno si carillon con esso.
OTOH, Rename-Item non specificare il parametro NewName come gasdotto vincolato nome della proprietà. In questo caso, basta fare il parametro NewName essere il tipo che si desidera (stringa) e lasciare PowerShell fare la magia scriptblock. Meglio di tutti, in questo caso $ _ lavora nel scriptblock per esempio:.
[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);
}
Altri suggerimenti
Sì. -NewName prende un blocco di script. Prova questo:
Function Do-MyRename {
param([ScriptBlock]$sb)
dir *.ps1| Rename-Item -NewName $sb
}