Domanda

Ho uno script di pulizia che sposta i file in base alla loro estensione in posizioni preimpostate appropriate.

Ad esempio, un file con l'estensione .xls verrà spostato nella cartella ~ xls, .sql a ~ sql e così via. Ecco la mia sceneggiatura.

$dirtyfolder = "\\server\c$\Documents and Settings\user\Desktop\"
$org = "\\BACKUPS\users\"
dir $dirtyfolder -fil *.doc | mv -dest "$($org)ORG\doc"
dir $dirtyfolder -fil *.txt | mv -dest "$($org)ORG\txt"
dir $dirtyfolder -fil *.sql | mv -dest "$($org)ORG\sql"
dir $dirtyfolder -fil *.log | mv -dest "$($org)ORG\log"
dir $dirtyfolder -fil *.zip | mv -dest "$($org)ORG\zip"
dir $dirtyfolder -fil *.7z | mv -dest "$($org)ORG\zip"
dir $dirtyfolder -fil *.png | mv -dest "$($org)ORG\img"
dir $dirtyfolder -fil *.jpg | mv -dest "$($org)ORG\img"
dir $dirtyfolder -fil *.mp3 | mv -dest "$($org)ORG\mp3"

Sono pienamente consapevole che questo in un modo inelegante per raggiungere il mio obiettivo. Quindi vorrei sapere come posso modificare lo script in modo che posso

  1. riutilizzare il codice ripetitivo
  2. Se la cartella di destinazione non esiste, dovrebbe essere creata.
  3. Gruppo estensioni simili, come PNG e JPG
È stato utile?

Soluzione

Testato. Una soluzione (non-ricorsiva) che non gestisce il raggruppamento:

ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{
  $dest = "$($org)ORG\$($_.extension)"
  if (! (Test-Path -path $dest ) ) {
    new-item $dest -type directory
  }
  mv -path $_.fullname -destination $dest 
}

Soluzione con il raggruppamento:

ls $dirtyfolder/* | ? {!$_.PSIsContainer} | %{
  $dest = "$($org)ORG\$(get-destbytype $_.extension)"
  if (! (Test-Path -path $dest ) ) {
    new-item $dest -type directory
  }
  mv -path $_.fullname -destination $dest 
}

dove get-destbytype è la seguente funzione:

function get-destbytype($ext) {
 Switch ($ext)
 {
  {$ext -match '(jpg|png|gif)'} { "images" }
  {$ext -match '(sql|ps1)'} { "scripts" }
  default {"$ext" }
 }
}

Altri suggerimenti

Questo è il mio test di lavoro

$source = "e:\source" 
$dest = "e:\dest"
$file = gci $source | ? {-not $_.psiscontainer} 
$file | group -property extension | 
        % {if(!(test-path(join-path $dest -child $_.name.replace('.','')))) { new-item -type directory $(join-path $dest -child $_.name.replace('.','')).toupper() }}
$file | % {  move-item $_.fullname -destination $(join-path $dest -child $_.extension.replace(".",""))}

Lo script troverà tutte le diverse estensioni nella cartella di origine. Per ogni estensione, se la cartella non esiste già all'interno della destinazione, verrà creata. L'ultima riga si avvicinerà a ciascun file dalla sorgente e lo sposterà nella destinazione della sottocartella destra.

Se si desidera inserire immagini con estensioni diverse nella stessa cartella necessaria per effettuare un ulteriore controllo, utilizzando un'istruzione IF o Switch.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top