Скрипт не работает, потому что
$XML_File = Get-ChildItem -Name "$Path\*.xml"
$PRO_File = Get-ChildItem -Name "$Path\*.PRO"
if($XML_File.BaseName -eq $PRO_File.BaseName)
не делает то, что задумано. Get-ChildItem
возвращает массив объектов FileInfo
, если существует более одного файла с соответствующим расширением. Массив не имеет BaseName
, поэтому, если вы используете Set-StrictMode -Version 'latest'
, вы получите ошибку о несуществующем свойстве.
Что касается решения, использовать на основе набора логика. Примерно так:
# Assume that these test files exist
data.xml
data2.pro
data2.xml
data3.xml
# Two empty arrays, populate each with basenames and see results
$xbase = @()
$obase = @()
@(gci * -include *.xml) | % { $xbase += $_.basename }
$xbase
data
data2
data3
@(gci * -exclude *.xml) | % { $obase += $_.basename }
$obase
data2
Теперь есть два массива, которые содержат базовые имена для файлов XML и файлов не-XML. Чтобы создать новую коллекцию файлов, которые не имеют аналогов, отличных от XML, сравните коллекции следующим образом:
$onlyXML = Compare-Object $xbase $obase -PassThru
$onlyXML
data
data3
Теперь коллекция $onlyXML
содержит базовые имена для файлов, которые не имеют аналога вне-XML коллекция. Обработка достаточно проста, просто не забудьте добавить .xml
для доступа к реальному файлу.
$onlyXML | % {
$x = gci "$_.xml" # For example, get a FileInfo about XML doc
# TODO: do stuff with $x
}