刪除指定資料夾內文件

Emily 資料夾管理 執行下列程式,刪除指定資料夾內檔案,剛開始測試時沒有問題,加入排程每日執行,剛開始幾天也沒有問題,可完全刪除資料夾內20~30 檔案,後來都無法刪除乾淨,手動測試時有時可以將資料夾內檔案全部刪除,有時只刪除1~2個檔案,請問可以如何修正

// input{} loads workspace txt file as value and filename as key
// output{} can be used to output txt value with filename from key
const clearExcelFiles = async () => {
const files = await api.files();
const excelFiles = files.filter(file => file.endsWith(‘.xlsx’) || file.endsWith(‘.xls’) || file.endsWith(‘.csv’) || file.endsWith(‘.txt’));

for (const file of excelFiles) {
await api.remove(file);
}
};

clearExcelFiles();

@chenpang.wu
我看程式碼,應該是沒什麼問題,會把結尾為xlsx、xls、csv、txt等檔案找出來並刪除。
你可以在6行加入console.log(excelFiles),看是否有拿到預期中的files。

也可以在貼上一下資訊,刪除前刪除後的資料夾有甚麼檔案,哪些是沒有被刪除掉的。

如果有解決您的問題再麻煩回覆一下,感謝!

尚未加入第6行程式

今日排程執行與手動測試都沒有問題,都可以全部刪除,我再觀察一下

1 Like

主要console.log出來是確認,將訊息console出來,看一下是否有篩選到正確的檔案,
另外沒有刪除也有可能是跑技能的當下,那個檔案是開起來的,而造成錯誤沒刪除。
好的,再觀察看看是否有問題

技能A : 將資料夾內多個.xls檔案合併新生成一個 .xlsx檔案

技能B : 將資料夾內EXCEL檔案刪除

分別獨立執行成功
技能A : 10個 .xls檔案合併新生成1個.xlsx檔案
技能B : 11個EXCEL檔案全部刪除

若技能A+B一起執行,結果只有技能A成功執行(新生成MergedFile.xlsx),技能B失敗,無法完全刪除

後續單獨再執行一次技能B,一樣無法一次全部刪除

可以試試看在你的powershell程式碼最後面加入,釋放記憶體試試看
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelApp) | Out-Null
有可能是EXCEL沒有完全關閉,所以導致無法刪除。

另外請問使用A+B執行結果有報出甚麼錯誤嗎?

我添加再測試看看

測試A+B,Debug沒有錯誤

技能A最後一段添加[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelApp) | Out-Null

第一次執行技能A+B 可完整刪除所有EXCEL檔案
第二次之後執行技能A+B 大多無法完整刪除

再次確認技能B單獨使用
若使用紅框 “TEST”,每次都可成功(測試10次都成功,一次就刪除乾淨)

若是存檔後執行程式,使用藍框 “測試”,幾乎都失敗,每次都只刪除其中幾個檔案,無法一次刪除乾淨

“TEST”、"測試"反覆進行驗證,只有"TEST"可成功,"測試"都失敗

可以將完整的powershell內的code貼上來,
我這邊試試看有甚麼問題。

技能A : PowerShell + 技能B : 資料夾管理

技能A : Powershell

設定要讀取的資料夾和輸出的檔案名稱

$folderPath = “C:\Folder”
$outputFile = “C:\Folder\MergedFile.xlsx”

取得資料夾中的所有 Excel 檔案

$filesToMerge = Get-ChildItem $folderPath | Where-Object { $_.Extension -eq “.xls” }

要使用的 COM 物件

$excelApp = New-Object -ComObject Excel.Application
$excelApp.Visible = $false
$excelApp.DisplayAlerts = $false

建立一個新的工作簿

$newWorkbook = $excelApp.Workbooks.Add()

開始合併

foreach ($file in $filesToMerge) {
# 打開要合併的檔案
$workbook = $excelApp.Workbooks.Open($file.FullName)

# 複製資料到新的工作簿中
foreach ($worksheet in $workbook.Worksheets) {
    $worksheetCopy = $worksheet.Copy($newWorkbook.Worksheets.Item($newWorkbook.Worksheets.Count))
}

# 關閉目前的工作簿
$workbook.Close()

}

儲存新的工作簿

$newWorkbook.SaveAs($outputFile)

關閉 Excel

$newWorkbook.Close()
$excelApp.Quit()

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelApp) | Out-Null

技能B : 資料夾管理

const clearExcelFiles = async () => {
const files = await api.files();
const excelFiles = files.filter(file => file.endsWith(‘.xlsx’) || file.endsWith(‘.xls’) || file.endsWith(‘.csv’) || file.endsWith(‘.txt’));

for (const file of excelFiles) {
await api.remove(file);
}
};

clearExcelFiles();

後續T1同仁協助修正,只使用Powershell,看起來可以正常執行,還在觀察中

設定要讀取的資料夾和輸出的檔案名稱

$folderPath = “D:\RPA\T1技術交流\刪除資料夾Data\原檔”
$outputFile = “D:\RPA\T1技術交流\刪除資料夾Data\Output\MergedFile.xlsx”

取得資料夾中的所有 Excel 檔案

$filesToMerge = Get-ChildItem $folderPath | Where-Object { $_.Extension -eq “.xls” }

要使用的 COM 物件

$excelApp = New-Object -ComObject Excel.Application
$excelApp.Visible = $false
$excelApp.DisplayAlerts = $false

建立一個新的工作簿

$newWorkbook = $excelApp.Workbooks.Add()

開始合併

foreach ($file in $filesToMerge) {
# 打開要合併的檔案
$workbook = $excelApp.Workbooks.Open($file.FullName)

# 複製資料到新的工作簿中
foreach ($worksheet in $workbook.Worksheets) {
    $worksheetCopy = $worksheet.Copy($newWorkbook.Worksheets.Item($newWorkbook.Worksheets.Count))
}

# 關閉目前的工作簿
$workbook.Close()

}

儲存新的工作簿

$newWorkbook.SaveAs($outputFile)

關閉 Excel

$newWorkbook.Close()
$excelApp.Quit()

刪除 Excel, CSV, 和 TXT 檔案

Get-ChildItem $folderPath -Include .xls,.txt,*.csv -Recurse | Remove-Item

1 Like

主要你的問題好像沒有辦法每次重現,有點無法確定和解決,我這邊測試起來是可以的。
如果是使用powershell合併,確實直接使用powershell刪除就是可以的。

另外可以在你新的程式碼後面最後也加上 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelApp) | Out-Null 。
這最主要是將EXCEL的COM關閉,會釋放記憶體,不然跑太多次類似的技能可能會導致記憶體被占用太久。

如有問題再回報。
如果有解決您的問題再麻煩回覆一下,感謝!

感謝!!
目前是直接使用powershell刪除,看起來沒有問題,持續觀察

1 Like