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?

È stato utile?

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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top