antivan
12-07-2025, 17:51
[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
}
об этом скрипте у меня на сайте (https://antivan.ru/blog/autoconvert-xls-to-xlsx/)
в общем-то все итак видно, так что по ссылке ходить совсем не обязательно
$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
}
об этом скрипте у меня на сайте (https://antivan.ru/blog/autoconvert-xls-to-xlsx/)
в общем-то все итак видно, так что по ссылке ходить совсем не обязательно