2017-01-19 4 views
0

Каждое утро папка получает те же самые имена почтовых файлов, которые были переданы ей. В настоящее время у меня есть скрипт, который будет проверять файлы без замятия, и если они существуют, создается архивная папка, и они перемещаются туда. Затем zip-файлы распаковываются, а затем zip-файл удаляется.Проверить файлы с одинаковыми именами в папке с разными расширениями, если существует, переместить один из

Пришло новое условие, что 1 файл не будет иметь ежедневную передачу, но он будет еженедельным (случайный день недели) и что связанный с ним незакрепленный файл должен оставаться в папке до тех пор, пока этот zip-файл переносится в.

Как бы я переделал свой код, чтобы проверять зашифрованные имена файлов на non-zipped, а если есть совпадение, чтобы переместить только эти файлы, прежде чем распаковывать остальные?

Мой текущий код: Первые 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.zip и C.zip, содержащие новый B.txt и C.txt, переносятся в ту же папку D: \ Test.

Почтовые файлы необходимо разархивировать, но соответствующие файлы B.txt и C.txt, которые уже находятся в этой папке, должны быть перенесены в D: \ Test \ Archive, затем B.zip и C.zip можно распаковать, оставив новый файл B.txt и C.txt в D: \ Test, а затем эти zip-файлы будут удалены.

У меня возникли проблемы с тем, что A.zip не переносится ежедневно. Это раз в неделю, и до тех пор, пока A.zip не попадет в папку, A.txt должен остаться в D: \ Test.

Прямо сейчас мой скрипт перемещает все файлы без zip в D: \ Test \ Archive каждый день. Поэтому, когда B.zip и C.zip входят в D: \ Test, после завершения процесса не будет A.txt, он перемещается в D: \ Test \ Archive с остальными файлами.

Так что мне нужно проверить все файлы .txt на .zip-файлы, а если есть совпадение по имени файла, а не по расширению, переместите этот незашифрованный файл в D: \ Test \ Archive. Если нет совпадения, оставьте этот незакрепленный файл в D: \ Test и продолжите обработку тех, которые соответствуют.

+0

Рассмотрите возможность добавления некоторых сценариев с соответствующими именами файлов. Таким образом, 'foo.zip прибывает, уже есть файлы bar и zof -> foo будут извлечены, и теперь есть файлы foo, bar ...' – vonPryz

+0

Ок, @vonPryz, я добавил сценарий процесса. Благодарю. – soMuch2Learn

ответ

1

Измените первую часть, как это:

$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" 
     } 
    } 
} 
0

Спасибо Matt! Я немного изменил некоторые вещи, но ваши циклы сравнения были ключевыми.

$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 
}