Исключение каталогов в ForEach-Object

У меня есть скрипт, который анализирует XML-файл и выводит текст определенного поля в текстовый файл для каждого XML-файла в каталоге.

Я сейчас пытаюсь, чтобы этот сценарий исключил конкретный подкаталог без удачи.

function xml-convert ($srcdir, $destdir) {
  gci $srcdir -r -Filter *.xml | ? {
    $_.DirectoryName -ne $destdir
  } | ForEach-Object{
    $extract = Get-Content $_.FullName

    $newname = Get-Item $_.FullName | % {$_.BaseName}

    $xml = [xml] $extract

    $xml.PortalAutoTextExport.AutoText.ContentText |
      Out-File -FilePath "$destdir\$newname.txt"
  }
}

Когда я бегу только этот кусок

gci $srcdir -r -Filter *.xml | ? {$_.DirectoryName -ne $destdir}

возвращаемый список файлов НЕ показывает исключенный каталог, а также не показывает никаких дочерних элементов для исключенного каталога, что является целью всего сценария.

Я пробовал несколько методов для исключения, и все не удалось. Это самое близкое к мне рабочее решение.

1 ответ

Решение

DirectoryName никогда не совпадет.\ Ex:

(dir .\Desktop -File).DirectoryName
C:\Users\frode\Desktop
C:\Users\frode\Desktop
C:\Users\frode\Desktop

Вам необходимо преобразовать относительный путь в абсолютный путь. Пример:

function xml-convert ($srcdir, $destdir) {
    $absolutedest = (Resolve-Path $destdir).Path

    Get-ChildItem -Path $srcdir -Recurse -Filter *.xml | Where-Object {
        $_.DirectoryName -ne $absolutedest
    } | ForEach-Object{
        $extract = Get-Content $_.FullName

        $newname = Get-Item $_.FullName | % {$_.BaseName}

        $xml = [xml] $extract

        $xml.PortalAutoTextExport.AutoText.ContentText |
        Out-File -FilePath "$absolutedest\$newname.txt"
    }
}
Другие вопросы по тегам