Как я могу переименовать файлы с помощью 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 }