使用PowerShell将一组名称相同但扩展名不同的匹配文件移动到两个不同的目的地

问题描述

|| 我想使用PowerShell将一组匹配的名称文件(1个作业文件和1个触发文件都具有相同的名称,只是扩展名不同)从一个目录移动到另一个目录。请参见下面的示例。 源目录包含job1.zip,job1.trg,job2.zip和job2.trg。我想采用匹配的作业名称job1.zip和job1.trg并将其移动到dest1folder,只有在它为空的情况下,如果不将其移动到dest2folder。然后循环返回以对job2.zip和job2.trg执行相同的逻辑。我还必须考虑的一件事是,源目录可能只包含job1.zip,等待传输job1.trg。我是PowerShell的新手,花了很多时间尝试使其无法成功运行。可能吗? 到目前为止,这就是我所拥有的。我使用IF逻辑将文件移动到每个目标文件夹,但是它将所有文件移动到源目录中。
$doirun = (get-childItem \"d:\\ftproot\\pstest\\\").Count

$filecount = (get-childItem \"d:\\ftproot\\ps2\\\").Count

if ($doirun -le 1) {exit} 

$dir = get-childitem \"d:\\ftproot\\pstest\\\" | Where-Object {($_.extension -eq \".zip\") -or ($_.extension -eq \".trg\")}

foreach ($file in $dir)
{
   if ($filecount -le 2) {Move-item \"d:\\ftproot\\pstest\\$file\"  \"d:\\ftproot\\ps2\\\"} 
   else {Move-item \"d:\\ftproot\\pstest\\$file\" \"d:\\ftproot\\ps3\\\"}
}
    

解决方法

尚未经过广泛测试,但我认为这应该可行:
$jobs = gci d:\\ftproot\\pstest\\* -include *.zip,*.trg |
  select -expand basename | sort -unique
$jobs |foreach-object {
 if (test-path d:\\ftproot\\pstest\\$_.zip -and test-path d:\\ftproot\\pstest\\$_.trg){
  if (test-path d:\\ftproot\\pstest\\ps2\\*){
    move-item d:\\ftproot\\pstest\\$_.zip d:\\ftproot\\pstest\\ps3
    move-item d:\\ftproot\\pstest\\$_.trg d:\\ftproot\\pstest\\ps3
    }
  else {
    move-item d:\\ftproot\\pstest\\$_.zip d:\\ftproot\\pstest\\ps2
    move-item d:\\ftproot\\pstest\\$_.trg d:\\ftproot\\pstest\\ps2
    }
   }