iT邦幫忙

0

bat語法詢問,如何自刪

舜~ 2021-03-17 15:37:004100 瀏覽

前輩們請教一下,

我有一個需求

將要執行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% 但這組在管理者權限下或是檔名路徑有特殊自元反而會無法執行command
start cmd.exe /C %command% 晚點來測試這組派送後能不能自我刪除...語法沒錯但失敗哈哈..

失敗猜測...會不會因為父層程序會等待所以子程序有關?
還是跟透過排程好了...

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
補覺鳴詩
iT邦高手 1 級 ‧ 2021-03-17 15:39:46

批次檔名稱 test.cmd
內容

del /F test.cmd
看更多先前的回應...收起先前的回應...
舜~ iT邦高手 1 級 ‧ 2021-03-17 15:42:37 檢舉

command內容已經有了
問題是無法在執行當下執行,因為檔案在執行當下是被鎖住的無法刪除,必須等執行結束後才能自刪

舜~ iT邦高手 1 級 ‧ 2021-03-17 15:43:17 檢舉

範例中的%myPath%就是指自己~~
我的直覺是start跟cmd的各種參數排列組合就好,但一直沒試出來....

不是很懂 我測就算不加 /f 也能自己把自己刪掉
你要不要自己先試一下,批次檔就那行指令
沒辦法是不是你中間的程式碼造成的?
我看你有帶 /s 有呼叫別的程式正在執行?
或是因為你放在特殊路徑,需有特殊權限才能刪除?

舜~ iT邦高手 1 級 ‧ 2021-03-17 17:28:37 檢舉

抱歉資訊不完整,補充說明一下,目前已是最高權限了,錯誤訊息為 "程序無法存取檔案 因為檔案正由另一個程序使用",所以打算繞一圈,等跑完後再回頭刪,所以才會透過start cmd

你是只刪這個 BAT ? 我說的你有做了嗎? 單純只有這行指令也不行?
是不是環境內有什麼軟體造成?
如果你真的想延遲一陣子再刪
那你可以利用 timeout 去等待固定時間再繼續執行
main.cmd

::
:: your code
::

start cmd.exe /c delAll.cmd

delAll.cmd

timeout 10
del /S /Q e:\1\
舜~ iT邦高手 1 級 ‧ 2021-03-18 01:38:53 檢舉

無法刪確實派送軟體的程序造成的,等該bat執行結束後手動、指令皆可刪,所以才想到延遲處理;然後剛發現只能派一隻bat...看來必須全部擠在main.bat中...

1
japhenchen
iT邦超人 1 級 ‧ 2021-03-17 15:54:24
( del /q /f "%~f0" >nul 2>&1 & exit /b 0  )
看更多先前的回應...收起先前的回應...
舜~ iT邦高手 1 級 ‧ 2021-03-17 16:16:07 檢舉

set command=del /q /f "%~f0" >nul 2>&1 & exit /b 0
這樣? 沒刪成功..

明明就有刪.......你......一定把括號拿掉了
https://ithelp.ithome.com.tw/upload/images/20210317/20117954TnoGL2cZ4W.jpg

別把我的括號拿掉啦

舜~ iT邦高手 1 級 ‧ 2021-03-17 16:48:44 檢舉

我補上括號試試...@@

舜~ iT邦高手 1 級 ‧ 2021-03-17 17:28:51 檢舉

錯誤訊息一樣是 "程序無法存取檔案 因為檔案正由另一個程序使用"

舜~

要自刪的批次檔內容
用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

https://ithelp.ithome.com.tw/upload/images/20210318/20117954A7q0BIZANy.jpg

嫌-n 10太少你可以加大到600(約10分鐘),不想出現 ping 的訊息你可以弄個 > nul 或 @ping 127.0.0.1

舜~ iT邦高手 1 級 ‧ 2021-03-18 21:50:26 檢舉

我晚點試試看~~

舜~ iT邦高手 1 級 ‧ 2021-03-26 16:10:27 檢舉

我加大到一小時了還是一樣,可能是派送軟體的bug,一直鎖定著...

試試把防毒給關了看看

舜~ iT邦高手 1 級 ‧ 2021-03-26 19:12:54 檢舉

跟防毒無關,瑞思GCB給人家卡住的

1
海綿寶寶
iT邦大神 1 級 ‧ 2021-03-17 17:41:32

一個排程,兩項工作
main.bat (執行主要任務)
2021/03/17 18:00 執行 del.bat (刪除 main.bat)

本是同根生,相煎何太急
/images/emoticon/emoticon82.gif

如果無法估計 main.bat 的執行時間
del.bat 如下

START /WAIT main.bat
del main.bat
舜~ iT邦高手 1 級 ‧ 2021-03-17 17:43:26 檢舉

有辦法在main.bat中指定 當前時間的10分鐘後執行del.bat (刪除main.bat)嗎?
不指定幾點幾分是因為天曉得執行完畢是什麼時候了~

修改答案如上

我要發表回答

立即登入回答