Код Powershell не может распознать все файлы Excel (*. Xlsm) в текущем местоположении - PullRequest
1 голос
/ 24 февраля 2020

В настоящее время я работаю над Powershell для обработки файлов Excel (*. Xlsm). Проблема в следующем коде может читать только «test.xlsm». Когда имя не проверяется как this.xlsm, этот код не может прочитать файл. Любая помощь...? Спасибо за ваш ответ заранее:)

$destination = "C:\JJ\"

$dirName = Get-ChildItem -Name -Filter *.xlsm
$saveAs = $destination + "new\"

foreach($z in $dirName){
    $excel=New-Object -ComObject Excel.Application
    $excel.visible=$false
    $excel.Displ`ayAlerts=$false
    $book=$excel.Workbooks.Open($destination + $z)
    $sheet=$book.Worksheets.item(1)  
    $sheet.Cells.Item(1,5)="=max(B2:B6)"
    $book.SaveAs($saveAs + $z)
    $excel.Quit()
    $excel=$null
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Вы используете в коде запутанные имена переменных. Зачем называть исходный путь $destination ??

В любом случае, вы должны использовать переключатель -File в командлете Get-ChildItem, чтобы убедиться, что будет возвращать только объекты FileInfo, а не объекты DirectoryInfo. (это Объекты , а не строки)

Тогда есть лучший способ построения путей. Используйте Join-Path вместо объединения таких вещей, как $destination + $z.

Наконец, я бы создал объект Excel только один раз, до l oop и после очистки памяти. Теперь вы создаете новые COM-объекты на каждой итерации и никогда не освобождаете их из памяти.

Ниже код должен делать то, что вы намерены:

$source = "C:\JJ"
$destination = Join-Path -Path $source -ChildPath 'new'

# test if the destination path already exists and if not, create it
if (!(Test-Path -Path $destination -PathType Container)) {
    $null = New-Item -Path $destination -ItemType Directory
}

# create the Excel COM object outside the loop
$excel = New-Object -ComObject Excel.Application
$excel.visible = $false
$excel.DisplayAlerts = $false

# get all *.xlsm files inside the source folder
Get-ChildItem -Path $source -Filter '*.xlsm' -File | ForEach-Object {
    # The $_ automatic variable represents 1 FileInfo object in each iteration
    $book  = $excel.Workbooks.Open($_.FullName)
    $sheet = $book.Worksheets.item(1)  
    $sheet.Cells.Item(1,5) = "=max(B2:B6)"
    # join the destination path and the file name for output
    $saveAs = Join-Path -Path $destination -ChildPath $_.Name
    $book.SaveAs($saveAs)
    $book.Close()
}

# cleanup Com objects
$excel.Quit()
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
$excel = $null

Примечание. Если у вас версия PowerShell ниже 3.0 переключатель -File недоступен. Вместо этого используйте

Get-ChildItem -Path $source -Filter '*.xlsm' | Where-Object {!$_.PSIsContainer} | ForEach-Object { ... }
0 голосов
/ 24 февраля 2020
# remove -name to get a directory object instead of a string
$dirName = Get-ChildItem -Filter *.xlsm

# you need the file name from the directory object listing
foreach($z in $dirName.name){ ...... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...