0

我需要替换文件名中的方括号,并且我已成功创建(并在控制台上验证) a -replace. 现在我正在尝试到Move-Item一个新目录,因为Powershell 2.0 中的这个错误阻止我进行简单的文件重命名。

这是我的脚本:

$txtPath = "c:\users\xxxxxx\desktop\cgc\tx"     #source files
$txtPath2 = "c:\users\xxxxxx\desktop\cgc\tx2"   #renamed files
Get-ChildItem $txtPath | foreach { 
    Move-Item -literalpath C:\users\xxxxxx\desktop\test001 ($_.Name -replace '\{|}','_') 
}

发生了什么事:我正在使用该$txtPath2变量,但一直收到“无法绑定到空目录”错误,因此我明确地对路径进行了编码,以查看变量的解析方式是否有些奇怪。现在,我收到此错误:

Move-Item : Cannot move item because the item at 'C:\users\xxxxxx\desktop\test001' does not exist.
At C:\users\xxxxxx\desktop\cgc\rni.ps1:5 char:10
+ Move-Item <<<<  -literalpath C:\users\xxxxxx\desktop\test001 ($_.Name -replace '\{|}','_')
    + CategoryInfo          : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand

奇怪的是:我创建了新目录。我运行脚本,当脚本失败时,看着它从我的桌面消失。怎么回事?我已退出并重新启动控制台应用程序以刷新所有变量。我已经尝试了不同风格的变量和常量Move-Item。除非Move-Item我缺少一个参数,否则我真的不知道发生了什么。有没有其他人看到任何会导致我的文件被删除的东西?

编辑:编辑后

Get-ChildItem $txtPath | % { [system.io.file]::Move($_.fullname, ($i.FullName -replace '\[|\]', '') ) }

我收到一个新错误:

Exception calling "Move" with "2" argument(s): "Empty file name is not legal.
Parameter name: destFileName"
At C:\users\x46332\desktop\cgc\rni.ps1:6 char:52
+ Get-ChildItem $txtPath | % { [system.io.file]::Move <<<< ($_.fullname, ($i.FullName -replace '\[|\]', '') ) }
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
4

1 回答 1

2

您将修改后的版本设置$_.Name为目标(第二个参数)。“名称”只是一个项目的文件名,所以我猜您的test001文件/文件夹已移动到您运行脚本的位置并重命名为$_.Name(它使用名称作为相对路径)。因此,如果您从c:\windows\system32(PS 以管理员身份运行时的默认文件夹)运行此脚本,则将其移动到那里。

下一次在您的foreach-loop 中,test001已经移动并返回错误。-LiteralPath是源位置,而不是目的地。

尝试:

Get-ChildItem $txtPath | % { [system.io.file]::Move($_.fullname, ($_.FullName -replace '\[|\]', '') ) }
于 2013-01-30T16:45:53.450 回答