Powershell 检查具有不同扩展名的文件夹中的同名文件,如果存在,请移出一个

Powershell 检查具有不同扩展名的文件夹中的同名文件,如果存在,请移出一个,powershell,zip,Powershell,Zip,每天早上,一个文件夹都会收到相同的zip文件。我目前有一个脚本,可以检查非压缩文件,如果它们存在,就会创建一个归档文件夹,并将它们移动到那里。然后解压缩zip文件,然后删除zip文件 出现了一个新的条件,即1个文件不会每天传输,但将是每周随机的一天,并且相关的非压缩文件必须保留在文件夹中,直到该压缩文件被传输进来 我该如何重新编写代码来检查压缩文件名和非压缩文件名,如果存在匹配项,则在解压缩其余文件之前只移动这些文件 我当前的代码: 第一个if语句测试不存在的zip文件。如果存在,将创建一个带有

每天早上,一个文件夹都会收到相同的zip文件。我目前有一个脚本,可以检查非压缩文件,如果它们存在,就会创建一个归档文件夹,并将它们移动到那里。然后解压缩zip文件,然后删除zip文件

出现了一个新的条件,即1个文件不会每天传输,但将是每周随机的一天,并且相关的非压缩文件必须保留在文件夹中,直到该压缩文件被传输进来

我该如何重新编写代码来检查压缩文件名和非压缩文件名,如果存在匹配项,则在解压缩其余文件之前只移动这些文件

我当前的代码: 第一个if语句测试不存在的zip文件。如果存在,将创建一个带有日期的新存档目录。然后,这些非拉链被移动到此文件夹

第二个if语句检查zip文件,如果存在,它将解压缩每个文件,然后删除zip文件

$dir = "D:\test"
$date = Get-Date -Format "yyyy-MMM-dd"

if (Test-Path "$dir\*" -Exclude *.zip -PathType Leaf) {
    $newDir = New-Item -Type Directory -Path "$dir\Archive\$date" -Force
    $nozip = gci -Recurse $dir -Exclude *.zip | where { ! $_.PSIsContainer }

    foreach ($file in $nozip) {
        Move-Item $file $newDir
    }
}
if (Test-Path "$dir\*.zip" -PathType Leaf) {
    $list = gci -Recurse $dir -Include *.zip
    $shell = New-Object -COM Shell.Application

    foreach ($file in $list) {
        $zip = $shell.NameSpace($file.FullName)
        foreach ($item in $zip.Items()) {
            $shell.NameSpace($dir).CopyHere($item)
        }
        Remove-Item $file
    }
} else {
    exit
}
示例场景:

文件夹D:\Test包含文件A.txt、B.txt和C.txt。 每天早上,包含新的B.txt和C.txt的B.zip和C.zip文件都会传输到同一个文件夹D:\Test

zip文件需要解压缩,但此文件夹中已存在的相应B.txt和C.txt需要移出到D:\Test\Archive,然后可以解压缩B.zip和C.zip,在D:\Test中保留新的B.txt和C.txt,然后删除这些zip文件

我遇到的问题是A.zip不是每天传输的。每周一次,在a.zip进入文件夹之前,a.txt需要保持在D:\Test中

现在,我的脚本每天都将所有非zip文件移动到D:\Test\Archive。因此,当B.zip和C.zip进入D:\Test时,在该过程完成后将没有A.txt,它将与其余文件一起移动到D:\Test\Archive


因此,我需要一种方法来对照.zip文件检查所有.txt文件,如果文件名匹配,而不是扩展名匹配,则将该非压缩文件移动到D:\Test\Archive。如果没有匹配项,则将该非压缩文件保留在D:\Test中,并继续处理匹配项

修改第一部分,如下所示:

$dir = "D:\Test"
$date = Get-Date -Format "yyyy-MMM-dd"
$newDir = New-Item -Type Directory -Path "$dir\Archive\$date" -Force
$files = (Get-ChildItem "$dir\*.txt").Name | foreach {$_.Split(".")[0]}
$zips = (Get-ChildItem "$dir\*.zip").Name | foreach {$_.Split(".")[0]}
foreach ($file in $files)
{
    foreach ($zip in $zips)
    {
        if($file -match $zip)
        {
            Move-Item "$dir\$file.txt" $newDir
            Write-Output "$file matches $zip"
        }
        else
        {
            Write-Output "$file does not match $zip"
        }
    }
}

谢谢你,马特!我稍微修改了一些东西,但比较循环是关键

$dir = "D:\Test"
$date = Get-Date -Format "yyyy-MMM-dd"
$newDir = New-Item -Type Directory -Path "$dir\Archive\$date" -Force
$fileName = gci $dir -exclude *.zip | ? { ! $_.PSIscontainer} | % { [IO.Path]::GetFileNameWithoutExtension($_) } | Sort
$zips = gci -recurse $dir -Include *.zip
$zipName  = $zips | % { [IO.Path]::GetFileNameWithoutExtension($_) } | Sort

foreach ($file in $fileName){
    foreach ($zip in $zipName){
        if($file -match $zip){
            Move-Item "$dir\$file.txt" $newDir
        }
    }
}

if (Test-Path "$dir\*.zip" -pathType leaf){
    $shell = New-Object -com shell.application
    foreach($file in $zips){ 
       $zip = $shell.NameSpace($file.FullName)
       foreach($item in $zip.items()){
           $shell.Namespace($dir).copyhere($item)
       }   
       Remove-Item $file
    } 
} else {
  Exit
}

考虑添加一些具有适当文件名的示例场景。像这样,foo.zip到达,已经有文件bar和zof->foo将被提取,现在有文件foo,bar…好的,@vonPryz,我添加了这个过程的场景。谢谢