Объединение сценариев ... Неправильный тип файлового объекта (может быть)?

295
J M

У меня есть скрипт, который я использовал очень часто, чтобы получить список файлов и затем обработать их с помощью ffmpeg, начало которого читалось так:

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

Мне нужно было решение, чтобы иметь возможность использовать его в каталогах, которые были бы более гибкими, но избегали пересечений в каталоге (команда recurse будет проходить всегда вниз по пересечениям). Я нашел ответ здесь на суперпользователя, ссылка . Я обернул свой оригинальный скрипт в функцию и изменил 4-ю строку найденной здесь функции recurse, чтобы вызвать функцию и обработать файлы, как они были найдены.

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 ... 

Но совершенно ясно, что функция recurse работает и генерирует список, не создает файл-объект того же типа (?), Что и get-childitem. Операции типа «Split-Path $ file -parent» теперь не работают и вместо этого ничего не возвращают. Все, что я тестировал систему, чтобы показать, что переменная $ file является System._ComObject, который, как я предполагаю, установлен в этой первой команде функций recurse. Разве это не то, что возвращает Get-Childitem? Как мне заставить две функции работать вместе?

Я открыт для изменения либо исходного сценария, либо функции recurse так, чтобы исходная возможность (например, вызов Split-Path) снова работала.

3

1 ответ на вопрос

1
Zoredache

System._ComObject, which I'm assuming is set in that first command of the recurse functions. Is that not what Get-Childitem returns?

No. The COM objects returned from the scripting.filesystemobject are different types of objects then what you get from the Powershell File system provider. The Powershell provider basically is composed of .NET System.IO.FileInfo objects. While it may seem like they are the same, since they are both dealing with filesystem operations, the two types of objects are not compatible.

Microsoft does provide a document that suggest conversions.

In fact your script already uses a method to convert them, in one of your if conditionals. The bit where you do a get-item $i.path. That code fragment basically converting one type of object to the other. It has Get-Item return a powershell filesystem object, and to do that, you give the Get-Item command the full path of the returned by the scripting.filesystemobject value you have in $i. You should be able to do this same trick in your other places as well.

Спасибо! Я нашел команду get-item, но я пытался все, кроме $ i.path, заставить его работать. Я пробовал строки, $ i.name, $ i, но не $ i.path. Это сработало отлично! Я не писал функцию recurse, поэтому я не был знаком с ее внутренними принципами :) J M 8 лет назад 0