0

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

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

所有文件名都与用户的用户 ID 相关。某些用户在此文件夹中有多个文件,因此它会在名称的末尾附加一个数字。IE susy.txt, susy1.txt, susy2.txt, carl.txt, carl1.txt, 等等...

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

甚至可以将其作为批处理文件执行,如果可以的话,有人可以指出我这样做的正确方向吗?我对编写批处理脚本有少量的知识,并想以此为契机进一步了解。


这与我之前提出的一个问题非常相似。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]
}

据我所知和基本理解,这应该可行......但我收到一条错误消息,提示 Move-Item : Cannot create a file when that file has already exists。

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 行代码中完成。这似乎有点多余。但我知道什么。

谢谢

4

2 回答 2

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}
于 2013-10-08T21:46:04.690 回答
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]
} 

但是我觉得,通过我在原始问题中之前输入的方法的一些变体,有一种更短、更简单的方法来做到这一点。

于 2013-10-08T20:57:29.460 回答