In Powershell ist die CopyHere-Methode für den Shell-Application-Namespace asynchron. Mein Hauptziel dabei ist, eine KML-Datei in eine KMZ-Datei zu konvertieren. Dazu erstellen Sie eine ZIP-Datei gleichen Namens, kopieren die KML in die KMZ (komprimiert die Datei) und benennen die ZIP-Datei in KMZ um. Asynchron bedeutet leider, dass die Umbenennungsfunktion aufgerufen wird, bevor die CopyHere-Methode abgeschlossen ist. Ich habe viele Beispiele gefunden, um das zu lösen. Die sauberste fand ich unter:PowerShell ZIP CopyHier wirkendes entgegenwirkendes asynchrones Verhalten
$kmlPath = $global:directoryPath + "Test.kml"
$zip = $global:directoryPath + "Test.zip"
New-Item $zip -ItemType file
$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zip)
$zipPackage.CopyHere($kmlPath, 16)
while($zipPackage.Items().Item($zip.Name) -Eq $null)
{
start-sleep -seconds 1
write-host "." -nonewline
}
write-host "."
Rename-Item -Path $zip -NewName $([System.IO.Path]::ChangeExtension($zip, ".kmz"))
Dieser reagiert mit dem folgenden Fehler:
Exception calling "Item" with "1" argument(s): "Not implemented (Exception from HRESULT: 0x80004001 (E_NOTIMPL))" + while($zipPackage.Items().Item($zip.Name) -Eq $null) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation
Bin ich die Item-Methode für dieses spezielle Paket zu mißbrauchen? Ich bin verwirrt, warum etwas, das "sauber" erscheint, nicht funktioniert. Ich habe auch das Code-Schnipsel Here versucht. Es beschwert sich auch über die .Item-Methode in dieser speziellen Situation.
Dies funktionierte tatsächlich perfekt. Ich musste "-ItemType-Datei" zur Instanziierung für neue Objekte hinzufügen, aber das war eine schnelle Lösung (andernfalls wurde ich aufgefordert, einen Typ einzugeben). Ich habe bemerkt, dass die Ausgabe in ISE jetzt eine Reihe von globalen Konfigurationen ausspuckt (CodeBase, FullName, EntryPoint, DefinedTypes und wie 40 andere). Ich bin mir nicht sicher, welcher Teil des Codes all diese Ausgaben ausgibt, aber es ist definitiv störend. Irgendwelche Ideen? –
Die Zeile '[Reflection.Assembly] :: LoadWithPartialName (' System.IO.Compression.FileSystem ')' speichert eine ausführliche Ausgabe der Assembly-Parameter in der Konsole. Ich habe es modifiziert, indem ich '| Out-Null 'bis zum Ende, um die Ausgabe zu maskieren. Alles funktioniert perfekt noch. –
Froh, dass es für dich funktioniert :) – ArcSet