Сравнить название файла с содержимым ячейки в Excel (скопировать файлы, которые совпали, в созданный каталог)

Коллеги, добрый день! Помогите разобраться, стоит задача:

  1. В подкаталогах среди файлов отобрать только Акты и Счета
$b = Get-ChildItem -Path С:\Акты\ -Force  -recurse -Include "*акт*.xlsx", "*счет*"
$b.basename
918100165822036731Акт06_00_24

918100165822036731Счет06_00_24

911008166031330831Акт06_00_24

911008166031330831Счет06_00_24

Требуется преобразовать чтобы имя было только номер, например:

911008166031330831

911005230819506751
  1. В файле Excel в соответствующих строках находится номер Акта и номер задачи
#75227866   918100165822036731
#75220883   911010667916896739

Написал код для парсинга Excel:

$ExcelObj = New-Object -comobject Excel.Application
$ExcelWorkBook = $ExcelObj.Workbooks.Open("c:\Акт\Акт.xlsx")
$ExcelWorkSheet = $ExcelWorkBook.Sheets.Item("NewItem")
$row = $ExcelWorkSheet.UsedRange.Rows.Count
for($i=2;$i -le $row;$i++)
{
$zadacha = $ExcelWorkSheet.Columns.Item(1).Rows.Item($i).Text 
$dogovor = $ExcelWorkSheet.Columns.Item(3).Rows.Item($i).Text
$zadacha
$dogovor
}

Задача следующая:

  • Сравнить название файла и результат строки в Excel. Если номера совпадают, то создается каталог с названием задачи, например #75227866 и в него переносятся файлы, которые совпали по условию

Ответы (1 шт):

Автор решения: Алексей Р

Комментарии в коде

$root = "c:\test\foo\" # задаем корневой каталог, где лежат файлы
$b = Get-ChildItem -Path "$root" -Force  -recurse -Include "*акт*.xlsx", "*счет*" 
$ExcelObj = New-Object -comobject Excel.Application
$b | ForEach-Object { # перебираем найденные файлы
    if ($_.basename -match "(?<code>^\d+)"){ # вытаскиваем номера из имен файлов
        $code = $Matches.code # помещаем номер [договора] из очередного файла в переменную
        $ExcelWorkBook = $ExcelObj.Workbooks.Open($_.fullname)
        $ExcelWorkSheet = $ExcelWorkBook.Sheets.Item("NewItem")
        $row = $ExcelWorkSheet.UsedRange.Rows.Count
        for($i=2;$i -le $row;$i++) {
            $zadacha = $ExcelWorkSheet.Columns.Item(1).Rows.Item($i).Text 
            $dogovor = $ExcelWorkSheet.Columns.Item(3).Rows.Item($i).Text
            $ExcelWorkBook.Close()>$null # закрываем книгу Excel
            if ($dogovor -eq $code){ # номер из имени файла и номер договора с листа совпали?
                $folder = "$root\$zadacha" # формируем путь к подкаталогу с номером задачи
                New-Item -ItemType Directory -Force -Path "$folder">$null # создаем подкаталог
                Copy-Item "$($_.fullname)" -Destination "$folder">$null # копируем в него файл
            }
        }
    }
}
$ExcelObj.Quit()>$null # закрываем Excel
→ Ссылка