Я пытаюсь разархивировать кучу архивов, включая новые файлы xlsx, в папку TMP, а затем работать с этой папкой, а затем удалить ее. И дерьмо просто не хочет идти своим путем.
$spath = "C:\_PS\TestFolder"
$destination=”C:\TestFolder\Testzip"
Get-ChildItem $spath -include *.xlsx -Recurse | foreach-object {
# Remove existing TMP folder and create a new one
Remove-Item -Recurse -Force $destination
New-Item $destination -type directory
$archiveFile = $_.fullname | out-string -stream
"Extract this: " + $archiveFile
"To here: " + $destination
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($archiveFile)
$destinationFolder = $shellApplication.NameSpace($destination)
$destinationFolder.CopyHere($zipPackage.Items())
}
И это всегда дает мне эти ошибки
Exception calling "NameSpace" with "1" argument(s): "Unspecified error (Exception from HRESULT: 0x80004005 (E_FAIL))" At C:\_PS\FindCC.ps1:62 char:46
+ $zipPackage = $shellApplication.NameSpace <<<< ($archiveFile)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation You cannot call a method on a null-valued expression. At C:\_PS\FindCC.ps1:64 char:50
+ $destinationFolder.CopyHere($zipPackage.Items <<<< ())
+ CategoryInfo : InvalidOperation: (Items:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Ваш скрипт отлично работает с ZIP-файлами:
Get-ChildItem $spath -include *.zip -Recurse
Я не уверен, почему вы используете:
-include *.xlsx
как это без учета ваши архивные файлы. Если хочешь шаг XLSX, тогда вам нужно будет написать еще один блок кода для обработки перемещения файла.
function Extract-Zip
{
param([string]$zipfilename, [string] $destination)
if(test-path($zipfilename))
{
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
$destinationFolder = $shellApplication.NameSpace($destination)
$destinationFolder.CopyHere($zipPackage.Items())
}
else
{
Write-Host $zipfilename "not found"
}
}
Использование функции:
Предположим, вы хотите распаковать zip-файл с именем «myzip.zip» в каталог «C: \ myFolder».
Убедитесь, что каталог «C: \ myFolder» существует, затем запустите Extract-Zip C:\myzip.zip C:\myFolder