我需要替换文件名中的方括号,并且我已成功创建(并在控制台验证)-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
答案 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 '\[|\]', '') ) }