iThome online | iT邦部落格 | Windows 7 Club

載入中...

kim29292729

IT邦初學者
10級

如何寫出判斷的批次檔
標籤:windows

@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但怎麼判斷卻想不出來,請大大指導一下謝謝

請問這位高手,那如果我想要寫一個批次檔是刪掉資料夾且裡面有資料,但我要刪的名稱是有「$」開頭的資料夾,這樣子有辦法做到嗎?

2008-11-15 22:00:29 補充



收到書籤:發佈到twitter      
解決時間:2008-11-29 18:15:01
發問時間:2008-11-15 18:14:47
▼ ADVERTISEMENT ▼

最佳解答(網友推薦)
20

回答:misadm ( IT邦好手7級 )

時間:2008-11-15 21:44:54

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

@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 行改寫成:
if not exist %windir%\KB956841.log (
     %PATHTOFIXES%\WindowsServer2003-KB914961-SP2-x86-ENU.exe /Z /M
     echo 安裝完成!!請重新開機
) else (
     echo 已安裝過此程式)

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

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

2008-11-17 09:08:45補充
要刪除含有資料的資料夾只要下一個指令即可:



rd $1234567890 /S /Q



/S : 除了目錄本身之外,一併移除指定目錄裡的所有目錄和檔案。

/Q : 安靜模式,有使用 /S 時,刪除目錄樹結構不再要求確認
如何寫出判斷的批次檔
回答:pankt( IT邦初學者7級 )
時間:2008-11-17 02:02:17
***回答已移除***
回答:pankt( IT邦初學者7級 )
時間:2008-11-17 02:32:31
9
這樣寫會更容易理解
@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仍可拆除
@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
:JUMPA
這樣就可以了!! XD2008-11-17 02:41:21 補充

回應

請填寫您的回應,長度限為1,000個字,回應不計點數,也不限使用次數



 

檢舉違規

違規事項:

*補充檢舉理由(可省略),字數不可超過100字

推薦

推薦理由:


*給回答者的鼓勵(可不填),字數不可超過100字

▼ ADVERTISEMENT ▼

訂閱每日摘要 HOT!

iT邦幫忙即日起提供「每日摘要」給尚未註冊的邦友,只要輸入您的E-mail,每日就可以收到最新的發問與分享
[查看最新的每日摘要]