Script de Powershell para agregar una extensión a un archivo, entrada desde CSV

Script de Powershell para agregar una extensión a un archivo, entrada desde CSV

Todo lo que necesito es tener una lista de Excel de rutas de archivos y usar Powershell para agregar (no reemplazar) la misma extensión a cada archivo.

Debería ser muy sencillo, ¿verdad? El problema que estoy viendo es que si voy import-csv -path myfile.csv | write-hostobtengo el siguiente resultado:

@{FullName=C:\Users\jpalumbo\test\appendto.me} 
@{FullName=C:\Users\jpalumbo\test\append_list.csv} 
@{FullName=C:\Users\jpalumbo\test\leavemealone.txt}

En otras palabras, parece que también está generando el "formato" CSV.

Sin embargo, si solo emito import-csv -path myfile.csv, el resultado es el que espero:

FullName
--------
C:\Users\jpalumbo\test\appendto.me
C:\Users\jpalumbo\test\append_list.csv
C:\Users\jpalumbo\test\leavemealone.txt

Claramente no hay ningún archivo llamado "@{FullName=C:\Users\jpalumbo\test\leavemealone.txt}" y cambiarle el nombre no funcionará, por lo que no estoy seguro de cuál es la mejor manera de obtener estos datos de la importación. -comando csv, o si almacenarlo en un objeto, o qué.

¡¡Gracias!!

Respuesta1

Prueba esto

$list=import-csv("myfile.csv")
foreach ($entry in $list) {
    $withExt=$entry.FullName+".txt"
    write-host $withExt
}

La parte complicada es que import-csv devuelve esencialmente una matriz de matrices. Es por eso que nuestra primera versión está formateada como está, ya que lo que obtiene write-host es una lista de listas. Tienes que iterar sobre cada línea y tratar cada línea individualmente. O al menos esa es una forma de hacerlo.

Massimo tiene una frase ingeniosa sobre este caso.

Respuesta2

Prueba esto:

Import-Csv -path myfile.csv | ForEach-Object { Write-Host $_.FullName }

Por supuesto, puedes hacer lo que quieras en el bloque de script de ForEach-Object, en lugar de simplemente escribir el valor del campo "FullName".

Esto agregará la extensión ".ext" a todos los nombres de archivos:

Import-Csv -path myfile.csv | ForEach-Object { Write-Host $_.FullName + ".ext" }

El truco aquí es:

1) Úselo ForEach-Objectpara actuar sobre los objetos reales creados por Import-Csv.
2) Úselo $_.FieldNamepara hacer referencia al valor de un campo determinado en cada objeto (correspondiente al valor del campo con el mismo nombre en el archivo CSV importado).

información relacionada