iT邦幫忙

2

如何用批次檔寫一個自動更新

spke 2018-03-26 02:30:495529 瀏覽

我想用批次檔寫一個自動更新
ex.
判斷 c:\a.exe 的檔案日期 與 \192.168.1.2\test\a.exe 檔案日期
如果 \192.168.1.2\test\a.exe 檔案日期較新 就將檔案copy c:\ 並覆蓋
如何時間一樣 則不執行

或者有什麼好的方法可以做到

看更多先前的討論...收起先前的討論...
yesongow iT邦大師 1 級 ‧ 2018-03-26 06:58:48 檢舉
怎麼不學VB呢?
spke iT邦新手 5 級 ‧ 2018-03-26 13:01:24 檢舉
這對我來說太難了
haha1811 iT邦新手 5 級 ‧ 2018-03-27 09:04:22 檢舉
可以試試看下面的指令
xcopy /D/K/E/Y/C/I \\192.168.1.2\test\a.exe c:\
or
xcopy /D/K/E/Y/C/I \\192.168.1.2\test\*.* C:\
clcy iT邦新手 3 級 ‧ 2018-03-27 09:10:14 檢舉
我以前也是用xcopy來作更新的動作,更新完後直接執行檔案。
請使用者改用批次檔來開啟作業,這樣子每次執行前都會去檢查是否有新的檔案了。

ex: xcopy \\192.168.1.2\test\a.exe c:\test\ /y/e/s/h/d
c:\test\a.exe
exit

印像中是這樣寫...參考一下
wwx iT邦研究生 1 級 ‧ 2018-03-27 10:10:24 檢舉
看到有經過網路,
提醒應用上還要注意時間的精度,
NTFS和FAT是不一樣的。

所以如果把NTFS複製到FAT上,
複製完之後比對時間還仍然是會不一樣,
這就要考慮DOS相容之方式(雙秒制)
6
haoming
iT邦好手 1 級 ‧ 2018-03-26 08:45:55

我覺得 可以不用 去判斷 檔案是否比較新
直接用 robocopy, 如果 來源與目的擋案一樣,自動會忽略.

robocopy \192.168.1.2\test\a.exe c:\a.exe

這樣就好了 ..

spke iT邦新手 5 級 ‧ 2018-03-26 13:04:14 檢舉

抱歉,我講的不夠清楚
因為我想利用這個方式來呼叫一個自動更新的批次檔
另外a. exe是 執行中的程式

1
I code so I am
iT邦新手 1 級 ‧ 2018-03-27 01:42:33

單純用DOS指令應該很難,建議使用 vbscript,可在 dos 下執行,如下,或設成批次檔。
cscript <vbs檔名>
1.建議參考 https://stackoverflow.com/questions/2973136/download-a-file-with-vbs
將檔案下載下來,放到 tmp 目錄
2. 參考 https://stackoverflow.com/questions/2832602/vbscript-compare-and-copy-files-from-folder-if-newer-than-destination-files
比較 tmp 目錄的檔案與目前的檔案,較新則覆蓋

0
Rex Wang
iT邦新手 5 級 ‧ 2018-03-27 07:59:50

建議您可以使用同步軟體 FreeFileSync 可以排程使用,應該有符合您的需求

1
m88310012
iT邦新手 5 級 ‧ 2018-03-27 09:47:06

@echo off
xcopy/Y/D c:\a.exe \192.168.1.2\test
pause

指令說明
@echo off 跟pause應該不用說明吧XD (有需要我再說明)
最主要的是xcopy/Y/D c:\a.exe \192.168.1.2\test\這一段
xcopy是windows內建的指令,
參數Y:不要提示您確認是否要覆蓋一個已經存在的檔案。
參數D:複製在指定日期當天或之後發生變更的檔案。如果沒有給日期,只複製那些來源檔案日期比目的檔案日期為新的檔案。(因為這邊沒有特別設定日期,所以只有當c:\a.exe的日期比目的地新的時候,才會複製過去)

請參考嚕~~

pcw iT邦研究生 5 級 ‧ 2018-03-27 21:44:04 檢舉

我有需要(小聲)

m88310012 iT邦新手 5 級 ‧ 2018-03-29 13:51:05 檢舉

好的
@echo off是指不顯示指令,也就是在這段指令後面下的"xcopy/Y/D c:\a.exe \192.168.1.2\test"這一段指令不顯示在螢幕上,如果把後面的off改成on,那就會顯示在螢幕上
pause是暫停的意思,如果沒加這一段,批次檔跑完,視窗就會關閉,加了pause就會顯示按一下繼續,如果你想確認程式跑完有沒有錯誤訊息,可以加個pause確認後再按一下關閉。

0
蟹老闆
iT邦大師 1 級 ‧ 2018-03-28 02:33:10

提問技巧滿重要的,原來不止只是COPY到的問題.
請參考

@Echo Off
Set S=來源路徑含檔名及副檔名
Set D=目地路徑含檔名及副檔名
Set Runing=檔名及副檔名
FC %S% %D% >Nul
If ERRORLEVEL 1 TaskKill /F /IM "%Runing%"&Copy /Y "%S%" "%D%"&Start "啟動程式" "%D%"

這個執行效率不如 forfiles ,如果檔案較大可以用二個forfiles抓出日期比對

ccutmis iT邦研究生 5 級 ‧ 2018-04-05 18:14:32 檢舉

/images/emoticon/emoticon12.gif

蟹老闆 iT邦大師 1 級 ‧ 2018-04-07 21:41:15 檢舉

/images/emoticon/emoticon15.gif
一開始想到的就是這個,比較好實作,如果要以時間來判斷除了forfiles及For還有一個古早指令更好實作。
比較下來 forfiles 又被打槍了,這個案例用forfiles實作反而最麻煩。
forfiles個人覺得好用的是日數差,這是for做不到的(比新舊還可以)

0
ce0133
iT邦新手 4 級 ‧ 2018-03-29 22:56:31

echo.
echo ............................................
echo 關閉程式....

taskkill.exe /F /IM a.exe

echo ............................................
echo 連線更新目錄

net use "\192.168.1.2\test" "密碼" /user:"帳號"
echo.
echo.
echo ...........................................
echo 正在複製程式系統更新,請稍後.....
xcopy "\192.168.1.2\test*.exe" "C:*.exe" /d /y /z /C /Q

echo 網路磁碟\離線
rem net use /delete "\192.168.1.2\test" /Y

我要發表回答

立即登入回答