Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
[String]$PathToAnalise = "D:\Обменка\Счета\"

$excel = New-Object -ComObject Excel.Application # открываем экземпляр Excel, он будет один на весь скрипт
For(  ;  ;  ) { 
    Get-ChildItem -Path $PathToAnalise *.xls -File -Recurse -Attributes `
        Archive,Compressed,Encrypted,Hidden,Normal,ReadOnly,NotContentIndexed,SparseFile,System |
        ForEach-Object {

        [String]$filefullname = $_.DirectoryName + "\" + $_.BaseName + ".xlsx";
        if (Test-Path -PathType Leaf -Path $filefullname) {
                $ErrorActionPreference = 'Ignore';
                Remove-Item -Path $_.FullName
                $ErrorActionPreference = 'SilentlyContinue';
        } else {
           $EWB = $excel.Workbooks.Open($_.FullName)
           $EWB.SaveAs($_.DirectoryName + "\" + $_.BaseName + ".xlsx", 51)
           $_.DirectoryName + "\" + $_.BaseName + ".xlsx"
           $EWB.Close()
           Remove-Item -Path $_.FullName
        }   
    }
    Start-Sleep -s 3
}
$excel.Quit() # закрываем экземпляр Excel - это действие бессмысленно,
# т.к. при нормальной работе выхода из цикла не произойдет,
# а при аварийной остановке скрипта исполнение до этого места не дойдет
У меня несколько лет работает так.
Если есть идеи, как не гонять цикл, а отслеживать именно появление файла - было бы интересно посмотреть.

Вариант без висящего в памяти Excel

Код: Выделить весь код
[String]$PathToAnalise = "D:\Обменка\Счета\"
For(  ;  ;  ) { 
    Get-ChildItem -Path $PathToAnalise *.xls -File -Recurse -Attributes `
        Archive,Compressed,Encrypted,Hidden,Normal,ReadOnly,NotContentIndexed,SparseFile,System |
        ForEach-Object {
        [String]$filefullname = $_.DirectoryName + "\" + $_.BaseName + ".xlsx";
        if (Test-Path -PathType Leaf -Path $filefullname) {
                $ErrorActionPreference = 'Ignore';
                Remove-Item -Path $_.FullName
                $ErrorActionPreference = 'SilentlyContinue';
        } else {
           $excel = New-Object -ComObject Excel.Application
           $EWB = $excel.Workbooks.Open($_.FullName)
           $EWB.SaveAs($_.DirectoryName + "\" + $_.BaseName + ".xlsx", 51)
           $_.DirectoryName + "\" + $_.BaseName + ".xlsx"
           $EWB.Close()
           Remove-Item -Path $_.FullName
           $excel.Quit()
           Stop-Process -Name EXCEL

        }   
    }
    Start-Sleep -s 3
}
об этом скрипте у меня на сайте
в общем-то все итак видно, так что по ссылке ходить совсем не обязательно

Отправлено: 17:51, 12-07-2025 | #21