Fundindo Scripts ... Tipo Errado de Objeto-Arquivo (Talvez)?

3

Eu tenho um script que eu usei com muita frequência para obter uma lista de arquivos e depois processá-los com ffmpeg, cujo início é:

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

Eu precisava de uma solução para poder usá-la em diretórios que fossem mais flexíveis, mas evitassem as junções em um diretório (o comando recurse viajará para sempre pelas junções). Eu encontrei uma resposta aqui no superusuário, link . Eu coloquei meu script original em uma função e modifiquei a quarta linha da função recurse encontrada aqui para chamar a função e processar os arquivos como eles foram encontrados.

function Recurse($path) {
  $fc = new-object -com scripting.filesystemobject
  $folder = $fc.getfolder($path)
  foreach ($i in $folder.files) {if ($i.name -match '.*\.(mp4|mkv|m4v|avi|wmv|mpg)$') {processFile($i)}}
  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
...

Mas, claramente, a maneira como a função recurse opera e gera a lista não cria o mesmo tipo de objeto de arquivo (?) que o get-childitem faz. As operações como "Split-Path $ file -parent" agora não funcionam e não retornam nada. Tudo que eu testei sistema para indicar que a variável $ file é um System._ComObject, que eu estou supondo que está definido no primeiro comando das funções recurse. Não é isso que Get-Childitem retorna? Como faço para que as duas funções funcionem juntas?

Estou aberto para modificar o script original ou a função recurse para que o recurso original (como chamar Split-Path) funcione novamente.

    
por J M 26.02.2016 / 22:15

1 resposta

1

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

Não. Os objetos COM retornados do scripting.filesystem_object são tipos diferentes de objetos, então o que você obtém do Provedor do sistema de arquivos Powershell . O provedor Powershell é basicamente composto de objetos .NET System.IO.FileInfo . Embora pareça que são os mesmos, já que ambos estão lidando com operações do sistema de arquivos, os dois tipos de objetos não são compatíveis.

A Microsoft fornece um documento que sugere conversões .

Na verdade, seu script já usa um método para convertê-los em uma de suas condicionais if. O bit em que você faz um get-item $i.path . Esse fragmento de código basicamente convertendo um tipo de objeto para outro. Ele tem Get-Item retornar um objeto do sistema de arquivos powershell e, para fazer isso, você concede ao comando Get-Item o caminho completo do retornado pelo valor scripting.filesystemobject que você tem em $i . Você deve ser capaz de fazer o mesmo truque em seus outros lugares também.

    
por 27.02.2016 / 01:50