Pregunta

Tengo un script de limpieza que mueve archivos en función de su extensión a ubicaciones preestablecidas apropiadas.

Por ejemplo, un archivo con la extensión .xls se moverá a la carpeta ~ xls, .sql a ~ sql y así sucesivamente. Aquí está el mi guión.

$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"

Soy plenamente consciente de que esto de una manera inelegada para lograr mi objetivo. Así que me gustaría saber cómo puedo modificar el script para que pueda

  1. Reutilizar el código repetitivo
  2. Si la carpeta de destino no existe, debe crearse.
  3. Grupo extensiones similares, como PNG y JPG
¿Fue útil?

Solución

Probado. Una solución (no recursiva) que no administra la agrupación:

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

Solución con agrupación:

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

dónde get-destbytype es la siguiente función:

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

Otros consejos

Esta es mi prueba de trabajo

$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(".",""))}

El script encontrará todas las extensiones diferentes dentro de la carpeta fuente. Para cada extensión, si la carpeta aún no existe dentro del destino, se creará. La última fila recorrerá cada archivo desde la fuente y lo moverá al destino de la subcarpeta derecho.

Si desea colocar imágenes con diferentes extensiones dentro de la misma carpeta, debe hacer una verificación adicional, utilizando una instrucción IF o A Switch.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top