У меня есть следующие сценарии для сжатия папки (все файлы в папке) в zip-файл:
set-content $zipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
$ZipFile = (new-object -com shell.application).NameSpace($zipFileName)
Get-ChildItem $folder | foreach {$zipFile.CopyHere($_.fullname)}
где $ folder = "C: \ Test" и $ zipFileName = "C: \ data \ test.zip "в качестве примера
Это прекрасно работает, если" C: \ Test "не содержит пустых подпапок, и кажется, что работает рекурсивно для сжатия всех файлов в подпапках.Мне очень нравится выше простой сценарий линии.Например:
C:\Test
file1.dat
file2.dat
Test-Sub
File21.bat
....
Однако я получил ошибку в одном случае.Я считаю, что если есть какая-либо пустая папка, такая как «C: \ Test \ EmptySub»,
C:\Test
file1.dat
file2.dat
Test-Sub
File21.bat
....
EmptySub
AnotherSub
file31.sp1
...
, сценарий выдаст ошибку.Я пробовал следующие сценарии:
Get-ChildItem $files -Recurse | foreach { if (!$_.PSIsContainer)
{$zipFile.CopyHere($_.fullname)}}
Это не работает, как ожидалось.Он просто пропускает все подпапки.Не уверен, что есть фильтр или предложение, доступное для пропуска всех пустых подпапок?
Обновлено : Исходя из подсказок, я попробовал.Моя проблема не решена.Вот обновление моего вопроса.Сначала я обновил приведенные выше сценарии, чтобы показать, как создается объект $ zipFile.Во-вторых, у меня есть предложенные коды:
Get-ChildItem $files | ? {-not ($_.PSIsContainer -eq $True -and
$_.GetFiles().Count -eq 0) } | % {$zipfile.CopyHere($_.fullname)}
Я пробовал обновления выше на моем WindowsXP, он отлично работает с пустыми подпапками.Однако те же коды не работают в Windows 2003 Server.Ниже приведено сообщение об ошибке:
[Название окна] Ошибка сжатых (заархивированных) папок
[Содержимое] Файл не найден или нет разрешения на чтение.
[OK]
Не уверен, работает ли объект PK этого типа на сервере Windows 2003 или имеются другие параметры для объекта.