
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-host
obtengo 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-Object
para actuar sobre los objetos reales creados por Import-Csv
.
2) Úselo $_.FieldName
para 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).