Usar CSV como fuente para copiar archivos

Usar CSV como fuente para copiar archivos

Tengo un archivo CSV (separado por punto y coma, en realidad) en Windows, con información de encabezado de columna. Una de las columnas contiene un nombre de archivo parcial; es un nombre de archivo sin ruta ni extensión. He estado intentando crear un script de PowerShell o Robocopy que lea esa columna y copie todos los archivos enumerados en esa columna desde una carpeta compartida a una carpeta local, pero no puedo hacerlo funcionar.

Así es como se ve el archivo de entrada

COL1;COL2;COL3;COL4;COL5

COL2contiene el nombre del archivo sin extensión.

Todos los archivos necesarios se encuentran en algún lugar del servidor de archivos \\server\share\folder\o \\server\share\folder\subfolder no sé el directorio de origen exacto.

¿Puedo crear un script de PowerShell o Robocopy que lea el archivo COL2, lo agregue .pdfcomo una extensión y copie archivos a mi unidad local, como C:\temp\dest, etc.?

He estado intentando que esto funcione así:

$VT = Import-Csv -Path "C:\test\test.csv" -Delimiter ";" | ForEach {
copy-item -Path C:\test\source\subfolder1\$($_.COL2)*.* -Recurse -Destination C:\test\dest
copy-item -Path C:\test\source\subfolder2\$($_.COL2)*.* -Recurse -Destination C:\test\dest
copy-item -Path C:\test\source\subfolder3\$($_.COL2)*.* -Recurse -Destination C:\test\dest
copy-item -Path C:\test\source\subfolder4\$($_.COL2)*.* -Recurse -Destination C:\test\dest
}

Pero me gustaría que el código fuera más simple y no con todas esas subcarpetas en el script. No logré que esa opción recursiva funcionara Copy-Item. Supongo que tendré que usarlo Get-ChildItemaquí, pero el script que he estado probando simplemente copia todo, desde el origen al destino, o se ejecuta y no hace nada.

Acabo de probar esto localmente, por lo que no es necesario usar carpetas del servidor todavía.

Respuesta1

Pruebe algo parecido a esto:

Import-Csv myfile.csv -header "Col1;Col2;Col3;Col4;Col5" | % {
    Copy-Item servername:\server\share\$_.pdf C:\temp\
    }

He hecho varias suposiciones sobre lo que estás intentando hacer.

  1. Su cultura local se ha configurado como alguna cultura europea, de modo que csv espera punto y coma en lugar de coma.
  2. No hay ningún encabezado en el archivo csv.
  3. El nombre de archivo parcial contiene toda la información de la subcarpeta necesaria para ubicar el archivo que se va a copiar.
  4. Está intentando colocar todos los elementos en subcarpetas de la carpeta temporal.

Si estas suposiciones son erróneas, tendrás que reescribirlas.

Respuesta2

Al leer la pregunta, parece que quieres algo como esto:

$sourcePath  = '\\server\share\folder'
$destination = 'C:\temp\dest'

# make sure the destination folder exists
$null = New-Item -Path $destination -ItemType Directory -Force

# import the data, and get an string array from COL2 from it
# make sure there are no duplicates in this aray and lop through the filenames
(Import-Csv -Path "C:\test\test.csv" -Delimiter ";").COL2 | Sort-Object -Unique | ForEach-Object {
    $fileName = '{0}.pdf' -f $_
    # try and find this file somewhere in the source path including its subfolders
    $original = Get-ChildItem -Path $sourcePath -Filter $fileName -Recurse | Select-Object -First 1
    if ($original) {
        $original | Copy-Item -Destination 
    }
    else {
        Write-Warning "File '$FileName' could not be found"
    }
}

información relacionada