Как я могу переименовать файлы с помощью PowerShell?
Я пытаюсь рекурсивно переименовать кучу TFS с помощью tf rename
, PowerShell и регулярное выражение, но у меня возникают некоторые проблемы с PowerShell, так как я не потратил много времени на это. Это то, что я собрал до сих пор, чтобы заменить ведущий 5
на 2.3.2
, но он не работает:
dir | foreach { tf rename $_ { $_.Name -replace '^5', '2.3.2' } }
Фактический результат:
Unrecognized command option 'encodedCommand'.
Unrecognized command option 'encodedCommand'.
Unrecognized command option 'encodedCommand'.
Unrecognized command option 'encodedCommand'.
...etc.
Update:
Я немного подошел, выполнив следующее:
dir | foreach { $newname = $_.Name -replace "^5", "2.3.2"; tf rename $_ $newname }
Моя следующая цель состоит в том, чтобы сделать это рекурсивные подкаталоги, но это кажется немного более сложным (изменение его на dir -recurse
заставляет его выйти из родительских папок по какой-то причине).
Ответы
Ответ 1
Я бы сначала отфильтровал по 5 *, поэтому вы обрабатываете только имена, начинающиеся с 5. Кроме того, в этом случае, поскольку tf.exe не является командлетом PowerShell, вы не хотите использовать скриптовый блок для определения нового имени, Просто используйте выражение группировки следующим образом:
dir -filter 5* | foreach { tf rename $_ ($_.Name -replace '^5', '2.3.2')}
Кстати, когда вы пытаетесь отлаживать параметр, передаваемый в родной EXE, это очень полезно использовать утилиту echoargs.exe из Расширения сообщества PowerShell. Это то, что он рассказал мне о вашем первоначальном подходе:
6# dir -filter 5* | foreach { echoargs rename $_ { $_.Name -replace '^5', '2.3.2' } }
Arg 0 is <rename>
Arg 1 is <5foo.txt>
Arg 2 is <-encodedCommand>
Arg 3 is <IAAkAF8ALgBOAGEAbQBlACAALQByAGUAcABsAGEAYwBlACAAJwBeADUAJwAsACAAJwAyAC4AMwAuADIAJwAgAA==>
Arg 4 is <-inputFormat>
Arg 5 is <xml>
Arg 6 is <-outputFormat>
Arg 7 is <text>
Ответ 2
Примечания:
- В большинстве случаев TFS имеет родные командлеты - не нужно tf.exe в большинстве случаев.
- Сложность времени операций рабочего пространства зависит от количества ожидающих переименований уже в рабочей области. В TFS 2005/2008 это значительно хуже, чем линейное. В нижней строке вы должны подумать о том, чтобы переименовать переименования в несколько проверок, если у вас есть большое количество элементов, иначе каждое "tf rename" (или New-TfsPendingChange -Rename при использовании командлетов) начнет принимать минуты.
Ответ 3
Попробуйте следующее:
dir . | foreach { $newname = $_.Name -replace "^5", "2.3.2"; tf rename $_ $newname }