Quiero cambiar el nombre de algunos archivos. Depende de la matriz de cadena nuevo nombre que tengo. Intenté esto, pero los archivos están cambiando el nombre de todos. Mi expectativa, el archivo solo cambia el nombre de 3 archivos, porque solo tengo 3 matrices. Por favor, ayuda cualquiera puede tener idea. Muchas gracias.

$Names = @("Student", "Employee", "Married")

$DataFile = Get-ChildItem -Path .\*.txt #There are more than 10 files

foreach ($name in $Names)
{
     $DataFile | Rename-Item -NewName {"$name" + $_.Name} 
}
0
SBR 24 jun. 2020 a las 10:32

2 respuestas

Si solo desea cambiar el nombre de tantos archivos como cadenas hay en su matriz $Names, puede hacer lo siguiente:

$Names = 'Student', 'Employee', 'Married'
$count = 0
Get-ChildItem -Path .\*.txt | Select-Object -First ($Names.Count) | ForEach-Object {
    $_ | Rename-Item -NewName ('{0}-{1}' -f $Names[$count++], $_.Name)
}
0
Theo 24 jun. 2020 a las 12:33

Para esto, deberá crear un contador ($i) para indexar en la otra matriz:

$Names = 'Student', 'Employee', 'Married'
$DataFile = Get-ChildItem -Path .\*.txt

$Names | ForEach-Object { $i = 0 } {
    Rename-Item $DataFile[$i] ($_ + $DataFile[$i++].Name)
}

Tenga en cuenta que el { {X0}} admite múltiples bloques de script:

Cuando proporciona varios bloques de secuencia de comandos para el parámetro Proceso, el primer bloque de secuencia de comandos siempre se asigna al bloque de inicio. Si solo hay dos bloques de script, el segundo bloque se asigna al bloque de proceso. Si hay tres o más bloques de script, el primer bloque de script siempre se asigna al bloque de inicio, el último bloque se asigna al bloque final y los bloques intermedios se asignan al bloque de proceso.

0
iRon 24 jun. 2020 a las 10:39