如何创建powershell脚本以将特定文件移动到其他位置?

如何创建powershell脚本以将特定文件移动到其他位置?,powershell,Powershell,所以我的任务是编写一个脚本,将文件从一个文件夹移动到另一个文件夹,这很简单。我遇到的问题是,这些文件是针对帐户的,因此将有一个名为DEA05292020.pdf的文件和另一个名为TENSJ05292020的文件,每个文件都需要转到特定的文件夹(例如,DEA05292020.pdf文件需要移动到一个名为DEA的文件夹中,TENSJ05292020将移动到TENSJ文件夹中。有100多个不同的帐户有自己的特定文件夹。这些文件都从我们的Recon文件夹开始,需要在每个月底移动到各自的accounts文

所以我的任务是编写一个脚本,将文件从一个文件夹移动到另一个文件夹,这很简单。我遇到的问题是,这些文件是针对帐户的,因此将有一个名为DEA05292020.pdf的文件和另一个名为TENSJ05292020的文件,每个文件都需要转到特定的文件夹(例如,DEA05292020.pdf文件需要移动到一个名为DEA的文件夹中,TENSJ05292020将移动到TENSJ文件夹中。有100多个不同的帐户有自己的特定文件夹。这些文件都从我们的Recon文件夹开始,需要在每个月底移动到各自的accounts文件夹中。所以我的问题是我如何才能开始创建powershell脚本来实现这一点。我对powershell非常陌生,一直在学习“在一个月的午餐中学习powershell”,并对其有基本的了解。因此,到目前为止,我所掌握的非常简单,我可以将文件复制到新文件夹:

复制项目-路径“\Sageshare\share\对账\PDF Recon Center\DEA Recon 05292020”-目标“Sageshare\share\Account Rec.Sheets\Separate Accounts\DEA”

这是可行的,但我需要更多的自动化来分离PDF Recon Center文件夹中的所有不同帐户名。我如何制作一个脚本来过滤帐户名(即:DEA)以及文件名中的月份和年份(即:052020从文件名的05292020部分拉出)


谢谢!

如果@Lee_Dailey想要编写代码并发布到这里,我会删除我的答案。他解决了问题,我只是编写了代码

请不要一次对所有内容进行测试,分批运行它,这样您就可以监视其行为,而不会扰乱您的环境。它以您可能不希望的方式移动文件,即,如果有一个名为a的文件夹,它会将与该文件夹匹配的所有内容都移动到该文件夹中。如果要防止这种情况发生,您可以在有更多文件夹的情况下编写预扫描在实际创建文件夹之前,“紧密匹配”该名称。非常确定它可以完成您想要的所有操作,但要以最简单的方式理解。:)


如果@Lee_Dailey想要编写代码并将其发布到这里,我将删除我的答案。他解决了问题,我只是编写了代码

请不要一次对所有内容进行测试,分批运行它,这样您就可以监视其行为,而不会扰乱您的环境。它以您可能不希望的方式移动文件,即,如果有一个名为a的文件夹,它会将与该文件夹匹配的所有内容都移动到其中。如果要防止这种情况发生,您可以在有更多文件夹时写入预扫描“在实际创建文件夹之前,与“该名称”紧密匹配。非常确定它可以以最简单的方式完成您想要的所有操作。:)


[1] 使用
Get ChildItem
获取文件列表。[2]使用
foreach
迭代文件信息项集合[3]解析每个文件的
.BaseName
以获取帐户前缀。最简单的方法看起来就像删除所有数字。[grin][4]使用
测试路径检查帐户目录。[5]如果不存在,则使用
New Item
[6]移动文件,使用
move Item
///这似乎涵盖了这个想法。[grin][1]使用
Get ChildItem
获取文件列表。[2]使用
foreach
迭代文件信息项集合[3]解析每个文件的
.BaseName
,以获得帐户前缀。最简单的方法就是删除所有数字。[grin][4]使用
测试路径检查帐户目录[5]如果它不在那里,则使用
新项目
[6]使用
移动项目
//移动文件,这似乎涵盖了这个想法。[grin]另外,我不知道为什么底部是红色的。我在我的机器上测试过,它工作了。我也不知道为什么底部是红色的。我在我的机器上测试过,它工作了。
$names =    $(gci -af).name |  
            ForEach-Object {
                if (-not ($_.Contains(".git"))){   
                    $_
                }
            }
if ( $null -eq $names ) {
    Write-Host "No files to move!"
    Start-Sleep 5
    Exit
}
$removedNames = $names | 
                ForEach-Object { 
                    $_ = $_.substring(0, $_.IndexOf('.')) # Remove extension
                    $_ -replace '[^a-zA-Z-]','' # Regex removes numbers
                }
$removedNames = $removedNames | 
                Get-Unique # Get unique folder names
$names | 
ForEach-Object {
    $name = $_    
    $removedNames | 
    ForEach-Object { 
        if ($name.Contains($_)) # If it matches a name
        { 
            if (-not (Test-Path ".\$_")) { # If it doesn't see the folder
                New-Item    -Path ".\" `
                            -Name "$_" `
                            -ItemType "directory"
            }
            Move-Item   -Path ".\$name" `
                        -Destination ".\$_" # Move file to folder
        }
    }
}