Una linea di comandi PowerShell

Questa semplice linea di codice PS ha un pattern che mi è spesso utile: in questo caso particolare serve a cancellare tutti i file con estensione .bak nella directory c:\temp e che non sono stati modificati da 31 giorni:

Get-ChildItem c:\temp\*.bak
| Where-Object { $_.LastWriteTime -lt
($(Get-Date) - $(New-TimeSpan -day 31))}
| Remove-Item

Il nucleo di tutto è nella cmdlet Where-Object che filtra l’output della cmdlet Get-ChildItem (l’equivalente di DIR) prelevando solo ai file che soddisfano la condizione e mandando questi in pasto alla cmdlet Remove-Item (l’equivalente di DEL). Il comando Get-ChildItem ha diversi parametri interessanti come la visita ricorsiva dell’albero delle directory o inclusione ed esclusione di file.

La condizione del filtro Where-Object utilizza l’aritmetica delle date. Il comando $(New-TimeSpan -day 31) produce un TimeSpan di 31 giorni. TimeSpan è una vecchia conoscenza di chi lavora in .NET e rappresenta una differenza temporale. Quindi il comando ($(Get-Date) – $(New-TimeSpan -day 31)) produce la data precente di 31 giorni quella di oggi. Il resto è un semplice confronto con l’attributo che memorizza l’ultimo tempo di scrittura del file.

Il pattern citato all’inizio del post è il seguente

  1. dammi una pipe di oggetti
  2. seleziona gli oggetti nella per produrre un’altra pipe
  3. fai qualcosa con gli oggetti selezionati

Direi che il 90% dei miei comandi di manipolazione “massiva” in PS seguono il pattern descritto. Ci sono poi eccezioni ma solitamente è così anche usando la shell in ambienti “ospiti” diversi dal sistema operativo. Il rimanente 10% si divide in comandi semplici e diretti e in file di script per operazioni più articolate.

Mi domando cosa fa il resto del mondo.

2 comments
  1. gallo said:

    pattern??? No, si chiama semplicemente algoritmo. Il pattern è un’altra cosa!

  2. Max said:

    Un algoritmo dovrebbe avere passi ben definiti e questo non li ha: i macropassi sono estremamente generici, si applicano ad ambiti anche molto diversi e con ampie variazioni e concatenazioni. Mi sembra più adatto pensarlo come un pattern. In effetti è una soluzione ad una famiglia di problemi con la stessa forma: cancellare i file troppo vecchi, definire la quota di una serie di mailbox, applicare un meccanismo di controllo ad una serie di macchine.

Leave a reply to gallo Cancel reply