Skripte zusammenführen ... Falscher Typ des Dateiobjekts (möglicherweise)?

357
J M

Ich habe ein Skript, das ich sehr häufig verwendete, um eine Liste von Dateien zu erhalten und sie dann mit ffmpeg zu verarbeiten. Der Anfang davon lautet:

$files = Get-ChildItem -Path "Season *\*" -Include *.mp4, *.mkv, *.m4v, *.avi, *.wmv, *.mpg -recurse ForEach ($file in $files) { $parent = Split-Path $file -parent $origFile = $parent+'\'+$file.name $shortName = $file.name .... 

Ich brauchte eine Lösung, um sie in Verzeichnissen einsetzen zu können, die zwar flexibler waren, aber die Verknüpfungen in einem Verzeichnis vermieden hat (der Befehl recurse wird die Verknüpfungen für immer weiterlaufen lassen). Ich habe hier eine Antwort auf Superuser gefunden, link . Ich wickelte mein ursprüngliches Skript in eine Funktion ein und modifizierte die vierte Zeile der hier wiedergegebenen Funktion, um die Funktion aufzurufen und die Dateien so zu verarbeiten, wie sie gefunden wurden.

function Recurse($path) { $fc = new-object -com scripting.filesystemobject $folder = $fc.getfolder($path) foreach ($i in $folder.files) } foreach ($i in $folder.subfolders) { $i | select Path  if ( (get-item $i.path).Attributes.ToString().Contains("ReparsePoint") -eq $false) {  Recurse($i.path) } } }  function processFile($file) { $parent = Split-Path $file -parent $origFile = $parent+'\'+$file.name $shortName = $file.name ... 

Die Art und Weise, wie die Recurse-Funktion arbeitet und die Liste generiert, erzeugt jedoch nicht den gleichen Typ von Dateiobjekt (?) Wie das get-childitem. Die Operationen wie "Split-Path $ file - parent" funktionieren jetzt nicht und geben stattdessen nichts zurück. Alles, was ich als System getestet habe, um anzuzeigen, dass die Variable $ file ein System._ComObject ist, von dem ich annehme, dass es in diesem ersten Befehl der Recurse-Funktionen festgelegt ist. Gibt es nicht das, was Get-Childitem zurückgibt? Wie kann ich die beiden Funktionen zusammenarbeiten lassen?

Ich bin bereit, entweder das Originalskript oder die Rekursionsfunktion so zu ändern, dass die ursprüngliche Funktion (z. B. der Aufruf von Split-Path) wieder funktioniert.

3

1 Antwort auf die Frage

1
Zoredache

System._ComObject, von dem ich annehme, dass es in diesem ersten Befehl der Recurse-Funktionen eingestellt ist. Gibt es nicht das, was Get-Childitem zurückgibt?

Nein, die COM - Objekte aus dem zurück Scripting.FileSystemObject sind verschiedene Arten von Objekten dann, was Sie von den bekommen Powershell Dateisystemanbieter . Der PowerShell-Anbieter besteht im Wesentlichen aus .NET- System.IO.FileInfo- Objekten. Obwohl es so aussieht, als seien sie gleich, da beide sich auf Dateisystemvorgänge beziehen, sind die beiden Objekttypen nicht kompatibel.

Microsoft stellt ein Dokument zur Verfügung, das Konvertierungen vorschlägt .

Tatsächlich verwendet Ihr Skript bereits eine Methode, um sie in eine Ihrer if-Bedingungen umzuwandeln. Das bisschen wo du einen machst get-item $i.path. Dieses Codefragment konvertiert grundsätzlich einen Objekttyp in den anderen. Es hat Get-Itemein Powershell-Dateisystemobjekt zurückgegeben. Dazu geben Sie dem Befehl Get-Item den vollständigen Pfad des von scripting.filesystemobject zurückgegebenen Werts an $i. Sie sollten in der Lage sein, diesen Trick auch an anderen Orten auszuführen.

Vielen Dank! Ich hatte den Befehl "get-item" gefunden, aber ich habe alles versucht, außer $ i.path, damit er funktioniert. Ich habe Strings ausprobiert, $ i.name, $ i, aber nicht $ i.path. Das hat perfekt funktioniert! Ich habe die Recurse-Funktion nicht geschrieben, also war ich nicht vertraut mit den inneren Abläufen :) J M vor 8 Jahren 0