Исключение каталогов в 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"
}
}