Решения PowerShell:
Решение PowerShell 7+ :
[Linq.Enumerable]::Zip(
[string[]] (Get-ChildItem . -File).FullName,
[string[]] (Get-Content FileNames.txt)
) | Rename-Item -LiteralPath { $_.Item1 } -NewName { $_.Item2 } -WhatIf
Примечание: -WhatIf
общий параметр in команда выше предварительно просматривает операцию. Удалите -WhatIf
, как только вы убедитесь, что операция выполнит то, что вы хотите.
Выше указано, что .
используется для нацеливания файлов в каталоге current ; приспосабливаться по мере необходимости.
Метод System.Linq.Enumerable.Zip
позволяет удобно перечислять пар элементов коллекции в виде двухэлементных кортежей; обратите внимание, что аргументы должны быть явно введены с помощью приведений ([string[]]
), чтобы PowerShell правильно разрешал вызов метода; в общем, обратите внимание, что в PowerShell, начиная с 7.0, отсутствует поддержка. NET методов расширения (что требует явного использования [System.Linq.Enumerable]
здесь) и всесторонняя поддержка для вызова generi c методов , хотя на GitHub есть запросы к функциям - см. здесь и здесь .
Эти кортежи переданы в Rename-Item
, чьи параметры связаны через блоки сценариев с задержкой привязки для динамического доступа к свойствам каждого входного кортежа.
PowerShell 6- решение:
# Read the array of lines == new file names from FileNames.txt
$names = Get-Content FileNames.txt
# Get as many files as new file names; '.' targets the current directory;
# Adapt as needed.
$files = (Get-ChildItem . -File)[0..($names.Count-1)]
# Perform the renaming.
$i = 0
$files | Rename-Item -NewName { $names[$script:i++] } -WhatIf
Примечание: переменная $i
упоминается как $script:i
в блоке сценария с задержкой привязки ({ ... }
), поскольку блок сценария выполняется в области действия child . Чтобы это также работало в тех случаях, когда родительская область не является областью действия сценария, используйте (Get-Variable -Scope 1 i).Value++
вместо $script:i++
.