iT邦幫忙

0

如何寫出判斷的批次檔

  • 分享至 

  • xImage

@echo off
setlocal
set PATHTOFIXES=\\192.168.2.205\it\Update_i386

%PATHTOFIXES%\WindowsServer2003-KB914961-SP2-x86-ENU.exe /Z /M
上面是一段批次檔的語法,但是我想在
%PATHTOFIXES%\WindowsServer2003-KB914961-SP2-x86-ENU.exe /Z /M
這一段加一個判斷,因為我要做出安裝過的話就不要去執行。通常這個檔裝過會在
windows的資料夾下產生一個文字檔例如 KB956841.log 這樣子的檔名,不知道有沒有大大知道該怎麼寫,我想過是用IF但怎麼判斷卻想不出來,請大大指導一下謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

44
misadm
iT邦高手 10 級 ‧ 2008-11-15 21:44:54
最佳解答

你可以使用下列判斷方式:

<pre class="c" name="code">@echo off
setlocal
set PATHTOFIXES=\\192.168.2.205\it\Update_i386
if not exist %windir%\KB956841.log (%PATHTOFIXES%\WindowsServer2003-KB914961-SP2-x86-ENU.exe /Z /M) else (echo 已安裝過此程式)

第 4 行的意思是說,在 Windows 的安裝目錄下(%windir% 是系統環境變數) 若不存在KB956841.log這個檔案,則會執行第一個括號內的指令。

反之,當檔案已存在時則會執行else後面括號內的指令。當判斷式成立時,你若不只要執行一個指令時,則可將第 4 行改寫成:

<pre class="c" name="code">if not exist %windir%\KB956841.log (
     %PATHTOFIXES%\WindowsServer2003-KB914961-SP2-x86-ENU.exe /Z /M
     echo 安裝完成!!請重新開機
) else (
     echo 已安裝過此程式)

要特別注意括號的位置,例如else前後的括號。

舉例供你參考,若有疑問可以再討論。

20
Pankt
iT邦研究生 1 級 ‧ 2008-11-17 02:32:31

這樣寫會更容易理解
@echo off
setlocal
set PATHTOFIXES=\\192.168.2.205\it\Update_i386
If EXIST %windows%\KB956841.log goto JUMPA
%PATHTOFIXES%\WindowsServer2003-KB914961-SP2-x86-ENU.exe /Z /M
goto END
:JUMPA
:END

假如 %windows%\KB956841.log windows目錄下存在 KB956841.log 這個檔案的話,就跳到 :JUMPA 這行
也就是,如果它找不到KB956841.log 這個檔案,就執行下行,即 執行
%PATHTOFIXES%\WindowsServer2003-KB914961-SP2-x86-ENU.exe /Z /M

第二個問題:想要寫一個批次檔是刪掉資料夾且裡面有資料,但要刪的名稱是有「$」開頭的資料夾

要刪目錄,先要清空目錄裡的檔案(以前DOS有工具,可以直接刪掉目錄),可能無法單存的用批次檔來完成,主要是DOS命令或批次檔無法過濾出只有目錄名稱的文字檔,它會包含有目錄裡的其他資訊。縱使可以,也無法循序的讀一行處理一行。

首先先建一個含有 $開頭的資料夾的文字檔
DIR $*.* | FIND "$" > A1.txt
這個命令是將目錄中含有$子目錄的目錄,經由 FIND 過濾器,只將含有$字元目錄送到新建的A1.TXT 檔案裡面。
說明:

代表新建一個檔案

代表附加到一個檔案
| 是 鍵盤 \上面那個記號,是管道的意思
打開 A1.TXT 你會發現只要目錄開頭含有$的目錄,均會被過濾出來,但是裡面也涵蓋了其他資料。
問題在這裡,我們要刪除目錄裡的全部檔案及拆掉目錄,目錄均不能用$*.* 來表示,也就是說 DEL $*.*\*.* 這個命令不會被執行,DEL $*.* 則會DEL $*.* 這些檔案,而非這些目錄。
如果寫一隻小程式,處理 A1.TXT 讓它只剩下含$的目錄名稱如A2.txt
接下來,再由隻種程式,以循序檔方式讀取A2.TXT,產生一個目錄一句批次檔命令
DEL $XX1 /s/Q
RD $XX1 /S/Q

DEL $XX2/s/Q
RD $XX1/S/Q

如果 $XX1目錄裡面還有子目錄, /S/Q DEL仍可刪除 /S/Q RD仍可拆除

我要發表回答

立即登入回答