为什么Powershell的Move-Item删除了目标目录?

时间:2013-01-30 16:16:13

标签: file powershell directory

我需要替换文件名中的方括号,并且我已成功创建(并在控制台验证)-replace。现在我正在尝试Move-Item到一个新目录,因为this bug in 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变量,但一直得到“无法绑定到null目录”错误,所以我明确地编码到路径,看看变量解析的方式是否有些奇怪。现在,我收到了这个错误:

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

这是奇怪的:我创建了新目录。我运行脚本,因脚本失败而从桌面上看它消失了。 WTF?我已经退出并重新启动控制台应用程序以刷新任何变量。我在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

1 个答案:

答案 0 :(得分:2)

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

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

尝试:

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