PowerShell переименовать элемент не может переименовать
Мой скрипт PowerShell:
$dst = 'C:\Temp'
#Get all folders in $dst
$folders = Get-ChildItem $dst | ?{ $_.PSIsContainer }
foreach($folder in $folders)
{
$cnt = (Get-ChildItem -filter *.txt $folder | Measure-Object).Count
$base = ($folder.FullName -split " \[.*\]$")[0]
$newname = $("{0} [{1}]" -f $base,$cnt)
Write-Host $folder.FullName "->" $newname
Rename-Item $folder.FullName $newname
}
Эта проблема
На моем первом запуске я получаю это:
PS C:\Temp> C:\Temp\RenameFolders.ps1
C:\Temp\m1 -> C:\Temp\m1 [1]
На моем втором запуске я получаю это:
PS C:\Temp> C:\Temp\RenameFolders.ps1
C:\Temp\m1 [1] -> C:\Temp\m1 [0]
Rename-Item : Cannot rename because item at 'C:\Temp\m1 [1]' does not exist.
At C:\Temp\RenameFolders.ps1:15 char:5
+ Rename-Item $folder.FullName $newname
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
Я знаю, что проблема в '[' и ']', но я действительно не могу понять, почему.
Может кто-нибудь объяснить мне, почему это проблема?
1 ответ
Если вы используете PS 3+, добавьте ключ -LiteralPath к вашему переименованию:
Rename-Item -LiteralPath $folder.FullName $newname
иначе использовать Move-Item
Move-Item -LiteralPath $folder.FullName $newname
Powershell не любит квадратные скобки в именах файлов, подробнее в следующем посте:
Это стало проблемой с V2, когда они добавили квадратные скобки в набор символов подстановки для поддержки "blobbing".
От get-help about_wildcards
:
Windows PowerShell поддерживает следующие символы подстановки.
Подстановочный знак Описание Пример соответствия Нет соответствия
Совпадает с нулем или * A, ag, Apple, банан, больше символов
? Точно соответствует? N, in, on выполнил один символ в указанной позиции
[ ] Соответствует диапазону [al]ook book, cook, look взял персонажей
[ ] Совпадает с указанным [bc]ook book, символами повара
[
а также ]
специальные символы.