Rename-Item - элемент не существует (проблема с символами ANSI в PowerShell)
У меня проблемы с переименованием элементов, содержащих символы ANSI, с помощью PowerShell.
Примерами являются такие символы, как "é" в "\Michael Bublé" или "\Green Day\¡DOS!"
Я хочу переименовать "\Michael Bublé" в "\Michael Buble".
Я сделал код для сопоставления символов с аз-символами. Проблема заключается в том, что когда я выполняю либо операцию Rename-Item, либо операцию удаления, система сообщает, что файл не существует.
Я думаю, что это может быть проблемой кодирования. Я не могу найти способ обойти это.
ren : Cannot rename because item at 'Michael Bublé' does not exist.
At C:\...\Replace_non_Ascii_FileObjectName.ps1:24 char:5
+ ren $_ $NewName
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand
3 ответа
Ваш вопрос немного скуден по деталям, поэтому трудно догадаться, что происходит. Было бы полезно, если бы вы предоставили полные команды, которые вы используете дословно, а не их описание. Кроме того, как вы входите в é
в твою команду? Копируете ли вы имя файла из списка каталогов, используете ли вы клавиатуру или эмулятор клавиатуры с таким символом, вводите ли вы его в текстовый процессор и копируете оттуда...? Чем детальнее и конкретнее вы являетесь, тем больше вероятность того, что кто-то сможет ответить на ваш вопрос.
Однако есть два предложения, которые я могу сделать.
Во-первых, на основании того, что вы написали, я подозреваю, что специальные символы даже не проблема. Это происходит только с именами файлов, которые не являются символами ASCII? Это команда, которую вы используете?
Rename-Item "\Michael Bublé" "\Michael Buble"
Если так, то это не сработает, если Michael Bublé
находится в корневом каталоге вашего текущего рабочего диска, и это независимо от того, есть ли в имени символы, отличные от ASCII. Так должно быть
Rename-Item ".\Michael Bublé" ".\Michael Buble"
Это при условии, что файл находится в текущем рабочем каталоге. В противном случае вместо .
, предоставьте полный путь.
Во-вторых, если вы считаете, что проблема заключается в кодировании, вы можете попробовать интерполировать символы в строку, приведя числа в кодировке Юникод как [char]: "Michael Bubl$([char]0x00E9)"
а также "\Green Day\$([char]0x00A1)DOS!"
Это своего рода выстрел в темноте, потому что вам не нужно этого делать. Если он правильно отображается на экране, он должен правильно интерпретироваться PowerShell. Особенно, если вы копируете имя из списка каталогов.
Обходной путь должен использовать 'cmd /c rename ...', используя относительные пути. Я сделал это, изменив каталог на папку, в которой находился файл, а затем вызвав команду cmd rename следующим образом:
$num=1
$files = gci -recurse
$files | ForEach-Object{
$folderPath = split-path $_.Fullname -parent
$originalFileName = split-path $_.Fullname -leaf
**$newFileName = "Michael Buble" + $num**
$num+=1
cmd /c echo "$folderPath" "$originalFileName" "$newFileName"
cd $folderPath
cmd /c rename "$originalFileName" "$newFileName"
}
Очевидно, что вы можете заменить часть newFileName своим отображением. Надеюсь, это поможет!
Одним из возможных путей решения этой проблемы было бы использование подстановочного знака:
dir "Michael Bubl?" | ren -NewName "Michael Buble"
Или отправьте это туда, где:
dir | where {$_.Name -eq "Michael Bublé"} | ren -NewName "Michael Buble"