0

我在使用 PowerShell 重命名包含 ANSI 字符的项目时遇到问题。

例如“\Michael Bublé”或“\Green Day\¡DOS!”中的“é”等字符。

我想要做的是将“\Michael Bublé”重命名为“\Michael Buble”。

我已经完成了将字符映射到 az 字符的代码。问题是当我执行 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
4

3 回答 3

1

你的问题在细节上有点吝啬,所以很难猜测发生了什么。如果您提供您正在使用的完整命令而不是描述它们,那将会有所帮助。另外,你是如何输入é你的命令的?您是否从目录列表中复制文件名,您是否使用具有该字符的键盘或键盘模拟器,您是否将其输入文字处理器并从那里复制...?您越详细和具体,就越有可能有人能够回答您的问题。

但是,我可以提出两个建议。

首先是根据你写的我怀疑特殊字符甚至不是问题。这仅发生在具有非 ASCII 字符的文件名中吗?这是您正在使用的命令吗?

Rename-Item "\Michael Bublé" "\Michael Buble"

如果是这样,除非Michael Bublé位于当前工作驱动器的根目录中,否则这将不起作用,并且无论名称中是否包含非 ASCII 字符。它应该是

Rename-Item ".\Michael Bublé" ".\Michael Buble"

假设该文件位于当前工作目录中。否则,.请提供完整路径,而不是 。

第二个是,如果您认为编码是问题,您可以尝试通过将 unicode 数字转换为[char]来将字符插入字符串:"Michael Bubl$([char]0x00E9)""\Green Day\$([char]0x00A1)DOS!"

不过,这有点像在黑暗中拍摄,因为你不应该这样做。如果它在您的屏幕上正确显示,则它应该被 PowerShell 正确解释。特别是如果您要从目录列表中复制名称。

于 2013-10-21T02:45:59.820 回答
0

一种解决方法是使用相对路径使用 'cmd /c rename ...'。我通过将目录更改为文件所在的文件夹来做到这一点,然后像这样调用 cmd 重命名命令:

$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 部分。我希望这有帮助!

于 2014-10-03T06:08:59.137 回答
0

一种可能的解决方法是使用通配符:

dir "Michael Bubl?" | ren -NewName "Michael Buble"

或将其通过管道输送到:

dir | where {$_.Name -eq "Michael Bublé"} | ren -NewName "Michael Buble"
于 2013-10-20T21:22:22.320 回答