我正在尝试将文件列表从一个目录移动到另一个目录。问题是,当项目移动到新目录时,我想自动组织它们。
实施例.. 我有一个包含数千个文件名的文件夹。
所有文件名都与用户的userID相关。某些用户在此文件夹中有多个文件,因此它会在名称的末尾附加一个数字。 I.E. susy.txt
,susy1.txt
,susy2.txt
,carl.txt
,carl1.txt
等......
我要做的是为每个拥有多个文件的用户创建一个特定文件夹(在新目录中),并将所有相关文件移动到该文件夹中。所以我注意到有多个可疑文件。所以我想创建一个名为Susy的文件夹,并将susy.txt
,susy1.txt
和susy2.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行代码中完成。这似乎有点多余。但我知道什么。
由于
答案 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]
}
但是我觉得,通过我之前在原始问题中输入的方法的一些变化,有一种更简单,更简单的方法。