前輩們請教一下,
我有一個需求
將要執行bat派送到 win7 / win8 上面,
bat執行完畢後要刪掉自己,但還在執行的時候bat檔案是被鎖住的無法自刪
錯誤訊息為 "程序無法存取檔案 因為檔案正由另一個程序使用"
所以我想延遲一小段時間再回頭刪掉自己
兩個思路
1.寫排程
=> 我只知道指定幾點幾分時觸發,但我想要幾分鐘後觸發不知道怎麼做,而且還要自刪排程..
比如說我希望現在開始後的5分鐘後觸發...
2.另開個cmd等待一小段時間後刪掉自己
=> 目前在嘗試第二個方法,但一時間不知道怎麼實現事後不理,都會變成等待刪除...
start後如何不要等待結束繼續往下執行??
@echo off
set myPath=%0
echo %myPath%
set command=echo "%myPath%" && ping 127.0.0.1 -n 5 -w 1000 && del /f /s "%myPath%"
start /elevate cmd.exe /c %command%
:: start後如何不要等待,直接繼續往下執行??
echo finish
ping僅作為延遲刪除的用途~
如果實現不了的話,寫排程要怎麼指定幾分鐘後觸發?
在本地上,目前嘗試出這兩組cmd /c start %command%
但這組在管理者權限下或是檔名路徑有特殊自元反而會無法執行commandstart cmd.exe /C %command%
晚點來測試這組派送後能不能自我刪除...語法沒錯但失敗哈哈..
失敗猜測...會不會因為父層程序會等待所以子程序有關?
還是跟透過排程好了...
批次檔名稱 test.cmd
內容
del /F test.cmd
command內容已經有了
問題是無法在執行當下執行,因為檔案在執行當下是被鎖住的無法刪除,必須等執行結束後才能自刪
範例中的%myPath%就是指自己~~
我的直覺是start跟cmd的各種參數排列組合就好,但一直沒試出來....
不是很懂 我測就算不加 /f 也能自己把自己刪掉
你要不要自己先試一下,批次檔就那行指令
沒辦法是不是你中間的程式碼造成的?
我看你有帶 /s 有呼叫別的程式正在執行?
或是因為你放在特殊路徑,需有特殊權限才能刪除?
抱歉資訊不完整,補充說明一下,目前已是最高權限了,錯誤訊息為 "程序無法存取檔案 因為檔案正由另一個程序使用",所以打算繞一圈,等跑完後再回頭刪,所以才會透過start cmd
你是只刪這個 BAT ? 我說的你有做了嗎? 單純只有這行指令也不行?
是不是環境內有什麼軟體造成?
如果你真的想延遲一陣子再刪
那你可以利用 timeout 去等待固定時間再繼續執行
main.cmd
::
:: your code
::
start cmd.exe /c delAll.cmd
delAll.cmd
timeout 10
del /S /Q e:\1\
無法刪確實派送軟體的程序造成的,等該bat執行結束後手動、指令皆可刪,所以才想到延遲處理;然後剛發現只能派一隻bat...看來必須全部擠在main.bat中...
( del /q /f "%~f0" >nul 2>&1 & exit /b 0 )
set command=del /q /f "%~f0" >nul 2>&1 & exit /b 0
這樣? 沒刪成功..
明明就有刪.......你......一定把括號拿掉了
別把我的括號拿掉啦
我補上括號試試...@@
錯誤訊息一樣是 "程序無法存取檔案 因為檔案正由另一個程序使用"
要自刪的批次檔內容
用ping -n 10來模擬delay 10秒
echo @echo off > b.bat
echo ping 127.0.0.1 -n 10 >> b.bat
echo del a.bat >> b.bat
start "wait delete" /B b.bat
exit 0
b.bat是由另一個start cmd所啟動,主批次檔不會等待b.bat執行完畢,刪除前的ping有點像是偽delay
嫌-n 10太少你可以加大到600(約10分鐘),不想出現 ping 的訊息你可以弄個 > nul 或 @ping 127.0.0.1
我晚點試試看~~
一個排程,兩項工作
main.bat (執行主要任務)
2021/03/17 18:00 執行 del.bat (刪除 main.bat)
本是同根生,相煎何太急
如果無法估計 main.bat 的執行時間
del.bat 如下
START /WAIT main.bat
del main.bat