iT邦幫忙

0

bat自動刪除舊備份資料夾-無錯誤也無刪除

  • 分享至 

  • xImage

請問一下,寫了一個批次檔用來刪除舊的備份資料夾,資料夾名稱是含有日期的,想用名稱來抓目標
執行完發現沒錯誤也沒有刪除,也確實抓到正確的資料夾名稱,直接把執行出來的 rd /s /q "E:\資料\LY Backup 2024-07-31 18;15 (完整)",手動執行一次也是可以的,但就是在批次檔裡跑會沒反應

請問是哪裡出了問題嗎? 謝謝
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

REM 設定要檢查的目錄路徑
set "backupPath=E:\西北資料"

REM 設定日期格式
for /f "tokens=1-3 delims=/- " %%a in ('date /t') do (
set "today=%%a-%%b-%%c"
)

REM 計算6天前的日期
for /f "tokens=1-3 delims=/- " %%a in ('powershell -command "(Get-Date).AddDays(-6).ToString('yyyy-MM-dd')"') do (
set "cutoffDate=%%a-%%b-%%c"
)

REM 刪除6天前的目錄
for /d %%i in ("%backupPath%*") do (
set "dirName=%%~nxi"
for /f "tokens=1-3 delims=- " %%a in ("!dirName:~10,10!") do (
set "dirDate=%%a-%%b-%%c"
if "!dirDate!" lss "!cutoffDate!" (
echo 刪除目錄: %%i
rd /s /q "%%i"
)
)
)

endlocal

pause
https://ithelp.ithome.com.tw/upload/images/20240813/20109224Y6TGcx65cU.jpg

看更多先前的討論...收起先前的討論...
我亂猜的,會是這個批次檔執行權限的關係嗎? 你要不要先將問題簡單化,先將批次檔寫個最簡單的語句(單純拷一個文字檔試試),讓系統時間到了去觸發看看,判斷是語句的問題或是執行時權限的問題(提醒~路徑別用中文字)。

以下是機器人的觀點
1. 路徑和許可權:
o 確保 E:\西北資料 目錄在批次檔自動運行時是可訪問的。有時,自動化任務在不同的使用者帳戶下運行,這些帳戶可能沒有相同的許可權。
o 自動執行的進程可能沒有刪除目錄或訪問路徑的必要許可權。
2. 日期和區域設置:
o date /t 命令的輸出可能會根據系統的區域設置而有所不同。這可能導致腳本在不同環境下解析日期時出錯。
3. 環境變數和系統路徑:
o 自動執行時,環境變數和系統路徑可能與手動執行時不同。確保腳本中使用的所有命令和路徑在自動運行環境中都能正確解析。
4. PowerShell 執行策略:
o 如果腳本中使用了 PowerShell 命令(如計算6天前的日期),確保自動執行時的 PowerShell 執行策略允許這些命令運行。
5. 工作目錄:
o 自動執行時,當前工作目錄可能與手動運行時不同。確保所有相對路徑都能正確解析,或在腳本開頭顯式指定工作目錄。
如果你已經確認路徑和許可權都沒問題,建議在自動執行的環境中增加一些調試輸出(例如使用 echo 命令列印變數值),以便更好地診斷問題。
通常
中文字會是個最大的問題
nwm310 iT邦新手 3 級 ‧ 2024-08-13 20:18:22 檢舉
ToString('yyyy-MM-dd') 單引號前面,不要放反斜線
謝謝各位,剛使用家裡的電腦執行是可以的,不過家裡電腦是Win11,所以也不確定跟這個有沒有關係,必須再找一台win10的電腦來測試看看
批次檔放的位置是不是在c當中? 要不要將批次檔移到D槽看看。
結果是提取檔名內的日期位置錯誤(不是每個的位置都一樣), 導致後面都出錯了,修正一下index就可以了,謝謝各位的幫忙
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
sam0407
iT邦大師 1 級 ‧ 2024-08-14 10:38:59

還是看的出來有錯誤呀!紅框這裡看起來都是異常,應該是取日期的部份出錯了
https://ithelp.ithome.com.tw/upload/images/20240814/20012665kkuYUxjvej.png

之前我有遇過不同OS的日期格式會不同,最簡單的測試就是您的電腦及家裡的電腦分別開CMD命令視窗打date /t 比較就知道,這兩台的設定一定有差異。像我下面的截圖是2024/08/14格式就不對,您需要設定為:2024-08-14
https://ithelp.ithome.com.tw/upload/images/20240814/20012665SwT1Pc2vIf.png

最簡單的作法就是改成和您家裡的電腦一樣的設定,W11設定的地方請見下圖,看起來您應該要改一下簡短日期的設定:
https://ithelp.ithome.com.tw/upload/images/20240814/20012665ijzAC3BuP1.png

另外溫馨小提醒,因為這個設定每個使用者可以設成不一樣,所以如果您是想要放到工作排程器裡每天自動跑,請記得一定要登入要跑這支排程的帳號確認過日期格式是正確的,排程跑才不會出問題。

我成功的電腦也是日期顯示2024/08/15,不過我覺得的確是像您所說的日期提取錯誤才導致,這個要研究一下為什麼了,我在另一台win10是可以的
cutoffDate= 應該是要顯示數字年-月-日,但在那台電腦顯示中文

sam0407 iT邦大師 1 級 ‧ 2024-08-15 09:02:21 檢舉

我在上面回文有說:

您需要設定為:2024-08-14

因為您的Script裡下面這一行,要找的分隔符號就是"-"
for /f "tokens=1-3 delims=/- " %%a in ('date /t') do (

sam0407 iT邦大師 1 級 ‧ 2024-08-15 09:05:39 檢舉

照下圖改一下試試吧~~
https://ithelp.ithome.com.tw/upload/images/20240815/200126657m6stjq2md.png

0
philipmeyer
iT邦見習生 ‧ 2024-09-14 11:29:54

automatically deleting cached items is quite inconvenient, it can cause loss of information that is inherent to a page or you can say that you are fixing this in a very non-specific way. Your code has to be modified a bit
Source: geometry dash deadlocked

0

automated cache deletion is cumbersome and can lose page-specific information or correct it in a non-specific fashion. You must modify your code. backyard baseball

我要發表回答

立即登入回答