跨目录移动和操作文件 - Powershell

时间:2013-10-08 20:48:53

标签: windows powershell batch-file

我正在尝试将文件列表从一个目录移动到另一个目录。问题是,当项目移动到新目录时,我想自动组织它们。

实施例.. 我有一个包含数千个文件名的文件夹。

所有文件名都与用户的userID相关。某些用户在此文件夹中有多个文件,因此它会在名称的末尾附加一个数字。 I.E. susy.txtsusy1.txtsusy2.txtcarl.txtcarl1.txt等......

我要做的是为每个拥有多个文件的用户创建一个特定文件夹(在新目录中),并将所有相关文件移动到该文件夹​​中。所以我注意到有多个可疑文件。所以我想创建一个名为Susy的文件夹,并将susy.txtsusy1.txtsusy2.txt放入其中......依此类推所有文件。

甚至可以将其作为批处理文件执行,如果是这样,有人能指出我正确的方向吗?我在编写批处理脚本方面有一些知识,并希望以此为契机,了解更多信息。


这与我之前提出的问题非常相似。 File and Folder Manipulation in Powershell。我非常感谢收到的回复,他们给了我很大的帮助。 Adi Inbar 的答案正是我当时所需要的。但是,我被迫做了一个修改,我自己也试过了。

Adi Inbar的回答

Get-ChildItem | ?{$_.Name -match '(\D+)\d*\.txt'} | %{
  md $matches[1] -ea SilentlyContinue 
  Move-Item $_ $matches[1]
}

简短的甜点和点,正是我需要的。但是它仅适用于要组织但保留在同一父文件夹中的文件。

这就是我的尝试:

Get-ChildItem –path "P:\My Documents\Org Test\Test1" | Where{$_.Name -match '(\D+)\d*\.txt'} | Foreach{
     md P:\'My Documents'\'Org Test'\Test2\$matches[1] -ea SilentlyContinue
     Move-Item $_ P:\'My Documents'\'Org Test'\Test2\$matches[1]
}

根据我的知识和基本理解,这应该有效...但我收到一个错误,说Move-Item:当该文件已经存在时无法创建文件。

At P:\My Documents\Org Test\Test.ps1:3 char:3
    +      Move-Item -Path P:\'My Documents'\'Org Test'\Test1\$_ -destination P:\'M ...
    +    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : WriteError: (P:\My Documents...t1\Johnny123.txt:FileInfo) [Move-Item], I
        + FullyQualifiedErrorId : MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

我确信这是我的舌头,但我无法得到它。我有非常基本的PowerShell脚本编写经验,只需要快速修复。


修改

我已经能够通过使用此脚本“解决”我的问题:

Get-ChildItem –path P:\'My Documents'\'PST Org Script'\Test1 | Foreach-Object{ 
    move-item -Path $_.fullname -Destination "P:\My Documents\PST Org Script\Test2" -ea SilentlyContinue }

cd P:\'My Documents'\'PST Org Script'\Test2

Get-ChildItem | ?{$_.Name -match '(\D+)\d*\.txt'} | %{
  md $matches[1] -ea SilentlyContinue 
  Move-Item $_ $matches[1]
} 

我很好奇。我觉得这可以在我上面的3行代码中完成。这似乎有点多余。但我知道什么。

由于

2 个答案:

答案 0 :(得分:1)

试试这个:

$srcPath = 'P:\My Documents\PST Org Script\Test1'
$dstPath = 'P:\My Documents\PST Org Script\Test2'
Get-ChildItem $srcPath | Where {$_.Name -match '(\D+)\d*\.txt'} | 
    Foreach {$targetDir = Join-Path $dstPath $matches[1]
             md $targetDir -ea 0
             Move-Item $_ $targetDir -WhatIf}

答案 1 :(得分:0)

我已经能够使用此解决我的问题:

Get-ChildItem –path P:\'My Documents'\'PST Org Script'\Test1 | Foreach-Object{ 
    move-item -Path $_.fullname -Destination "P:\My Documents\PST Org Script\Test2" -ea SilentlyContinue }

cd P:\'My Documents'\'PST Org Script'\Test2

Get-ChildItem | ?{$_.Name -match '(\D+)\d*\.txt'} | %{
  md $matches[1] -ea SilentlyContinue 
  Move-Item $_ $matches[1]
} 

但是我觉得,通过我之前在原始问题中输入的方法的一些变化,有一种更简单,更简单的方法。