2013-10-08 41 views
0

我正试图将文件列表从一个目录移动到另一个目录。问题是,当项目移动到新目录时,我想自动组织它们。跨目录移动和操作文件 - Powershell

Ex .. 我有一个包含数千个文件名的文件夹。

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

我所试图做的是创造具有多个文件中的每个用户的特定文件夹(在新目录),并将所有相关文件成夹。所以我注意到有多个susy文件。所以我想要创建一个名为Susy的文件夹,并将susy.txt,susy1.txtsusy2.txt放入其中......等等所有文件。

它甚至有可能做到这一点作为一个批处理文件,如果有的话可以有人指出我在这样做的正确方向吗?我在编写批处理脚本方面有少量知识,并希望以此为契机了解更多信息。


这与我以前问过的问题非常相似。 File and Folder Manipulation in Powershell。我非常感谢收到的回复,他们对我非常有帮助。 的答案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] 
} 

据我所知,并基本了解这应该工作。但是我收到一个错误说布展项目:当文件已存在无法创建文件。

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] 
} 

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

感谢

回答

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] 
} 

不过,我觉得,还有通过I较早进入该方法的一些变化这样做的更短,更简单的方法在我原来的问题。

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}