顯示具有 Batch 標籤的文章。 顯示所有文章
顯示具有 Batch 標籤的文章。 顯示所有文章

2012年2月15日 星期三

WEVTUTIL-管理事件檢視器的工具


WEVTUTIL 是一個很強大的管理事件檢視器的工具,參數有夠多的,適用於Windows 7、 Windows Server 2008、Windows Server 2008 R2及Windows Vista,拿來清事件檢視器的紀錄超方便,舉幾個我用到的例子吧

1.列出所有log名稱
WEVTUTIL EL

2009年4月18日 星期六

列出FTP虛擬目錄

根據IIS的說明主題裡有提到
下列命令是顯示Test Downloads FTP 站台之根目錄中的虛擬目錄
iisftpdr /query "Test Downloads"
Alias Physical Root
=====================
/Scripts  C:\Libraries\Scripts

2009年2月5日 星期四

FINDSTR進階用法

想搜尋大量文字檔裡的字串,建議FINDSTR一定要學會用,很方便的喔,我這幾天才知道原來有支援一般表示式呢,使用起來更加強大喔

A.利用/G從指定的檔案取得搜尋字串清單(按我看一下會更了解這怎麼用)
  請把下列的"&"替換成shift+\囉,也就是一條直線的管道符號(因blogger把我字給吃了)

findstr /s /i /G:search.txt d:\*.asp & findstr /v /i /G:exclude.txt > c:xx.log

其中 search.txt 是搜尋字串所在的檔案,d:\*.asp加/s是要搜尋D槽下所有asp的檔案,exclude.txt 是要排除的搜尋字串所在的檔案,xx.log則存放搜尋結果。

B.使用一般表示式(Regular Expression)
 以下是FINDSTR所支援的中繼字元,雖沒有很多,但我覺得很夠用囉


 0.跟著我一起練習,會比較了解喔,先把以下綠色文字複製後存成xx.txt,此例是txt是放在f槽,所以下面的語句請自行依情況變換喔


select * from comp
32165469874
select * from accomplish

select * from Comp
546VDFBSF4545
from
select * from comp
select * from COMP
compare


 1.通常若不知道一般表示式怎麼用,想搜尋comp字串,語句可能會長的像下面這行一樣,但是這樣的執行結果會跑出一些我們不需要的結果,如accomplish與compare,如下圖1的地方
findstr "comp" f:\xx.txt
 2. 若知道一般表示式,可以利用"\<"與"\>"來包住comp,限制該字元開頭跟結尾,就可以只找到你要的,就不會跑出accomplish與compare的結果囉,見下圖2的地方
因為這blog會過濾換行字元,所以指令請見圖吧
 3.若只想搜尋comp字串,但是c又不限定大小寫,就可以用中括號來包含字元集合[Cc],意思就是C或c皆可囉,像"[Cc]omp"就是Comp與comp都可,見下圖3
findstr "[Cc]omp" f:\xx.txt


 4若想找開頭為comp的字串,c不分大小寫,見下圖4
findstr "\<[Cc]omp" f:\xx.txt
 5.若想找結尾為comp的字串,c不分大小寫,見下圖5
findstr "[Cc]omp\>" f:\xx.txt
 6.若想找comp的字串,全部不區分大小寫,見下圖6,其實也是可以用"/i" 的
findstr "[Cc][oO][Mm][Pp]" f:\xx.txt


 8.若想找"from comp"字串,中間有一個空格的,可不能直接用"from comp"喔,那可是會找出from或comp的字串啊,所以得用中繼字".",如"from.comp",但是找出的結果可能會有很多,因為"."是萬用字啊,可以替換成任何字元,如圖8
因為這blog會過濾換行字元,所以指令請見圖
 7. 前面已提過"."表示搜索的條件是任意字元,而"*"在一般表示式中的作用不是任意字元喔,而是表示左側字元可以重複的意思,"*"表示重複的次數可為零次或者多次。所以若搜尋字串中使用".*",表示在那字串中可以夾雜0個,1個或很多個任意字元的喔,見下圖7,"from.*comp"的意思就是"from"與"comp"間可以含一個空白或很多空白的意思,在此例囉


 9.範圍[a-z]這種的我就不介紹,因為用起來怪怪的,似乎有問題,網路上我也查到似乎是各bug(Ranges [a-z] and [A-Z] perform INCONSISTENTLY in 2K/XP)


 10."^" 表示行首,"^from"就表示要找一行開頭必須為"from"的囉,其餘的皆不符合,語句如下
findstr "^from" f:\xx.txt
from

 11."$"表示行尾,"comp$"即表示要找一行結尾必須為"comp"的囉
findstr "comp$" f:\xx.txt
select * from comp
select * from  comp

c.利用for迴圈

 介紹到這,當你已了解我前面介紹findstr使用檔案內容當作搜尋清單及一般表示式這兩種用法之後,你就可以把他們結合起來用囉,搜尋清單的內容使用一般表示式,然後如果你再用上for迴圈的話,就可以作到依收尋字串分成數個搜尋結果檔囉!要不然結果全都導入一個檔,之後若要在分類很麻煩的,不如一開始就作好它!那怎麼用呢?語句如下,是一行喔不是兩或三行!要存成bat檔喔! 請把下列的"&"替換成shift+\囉,也就是一條直線的管道符號(因blogger把我字給吃了)
for /f "tokens=1,2 delims=," %%i in (c:\search.txt) do findstr /S /N /R "%%j" D:\svn_meta\*.j* & findstr /v /i /G:exclude.txt > d:%%i.log

我這邊的例子,假設我想找"from travel"及"from zip"這兩個字串,分別希望搜尋結果是導入travel.log及zip.log,search.txt的內容應該長的像下面這兩行
travel,from.travel
zip,from.zip


若看不懂,建議先看我令一篇For的應用

2009年2月4日 星期三

FOR語句的應用

可能很多人不知道在Batch裡也有迴圈可以運用喔,我個人覺得這功能非常強大,雖然我只會簡單的,但有時可幫助我節省不少工作時間呢!
  可在命令列下"for /?"得到詳細資訊喔

0.基本應用(沒有啟用擴充命令)
 就是手動去指定迴圈範圍,語句如下
 FOR %variable IN (set) DO 指令 [command-parameters]

 例子1:如何快速找出硬碟CDE槽的剩餘可用空間 。
 語句1: 請把&替換成shift+\囉(blogger把我字給吃了)
for %i in (c d e) do @dir %i: & find "位元組可用"
 22 個目錄 6,034,595,840 位元組可用
 15 個目錄 1,634,000,896 位元組可用
 8 個目錄 3,506,417,664 位元組可用
 補充1:@ 只是讓輸出結果不包括 dir命令本身而已

 例子2:參考刪除隨身碟病毒裡的一段,內容意思是解除所有硬碟內的autorun.inf及ntdelet.com的屬性,然後刪除它們並隱藏訊息 。
 語句2:
for %%x in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
attrib -r -s -h -a %%x:\autorun.inf >nul 2>nul&&attrib -r -s -h -a %%x:\ntdelect.com >nul 2>nul
del %%x:\autorun.inf /q /f >nul 2>nul&&del %%x:\ntdelect.com /q /f >nul 2>nul )
 補充2:&&的意思是前面命令成功才接著作後面的命令,各位注意可以用小括號來包更多的命令喔,如果要在批次程式中使用 FOR 指令,請指定 %%variable,而不要指定%variable

1.用/R參數列舉所有目錄
 
語句如下
 FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

 例子3:用for來實現與dir /s /b E:\test\*.txt一樣的結果 。
 語句3:
for /R E:\test %i in (*.txt) do echo %i
 補充3:運用得當就可以對當前目錄下所有檔(包括子目錄裏面的檔)進行操作,像例子4

 例子4:用Subversion版控來管理程式碼時,若要將某各版本全部取出,往往每層目錄裡都含有".svn"的隱藏目錄,對用來上線來說,那些目錄都是多餘的,此時就可以利用for /r來清除這多餘目錄囉。

 語句4:
for /R d:\33 %i in (.) do @if exist %i\.svn rd /s /q "%i\.svn"
 補充4:如果 set 只是單一句點 (.) 字元,它只會列舉樹狀目錄結構喔。然後用if exist來判斷的原因是因為for只是機械化的列舉目錄,在此例底下不一定有.svn目錄,所以加判斷會安全點。最後因為rd /s /q這指令太可怕了,使用前最好先替代成echo看一下,要不然執行錯誤可是很慘的,像是例子3那樣。差點忘了一點,列舉目錄結構會多一層".",像"d:\33\cat\.",但這並不影響執行結果喔。

2. 用/F參數將檔案內容作為迴圈範圍
 語句如下
 
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

 例子5:假設我有一個jj.txt檔案列表,我想連同檔案目錄的架構一起複製到c槽,檔案列表如下

c:\temp\a1.txt
c:\temp\test\a2.txt
c:\temp\test\f\a3.txt
c:\temp\bbb\a4.txt

 語句5:
for /f %%i in (C:\jj.txt) do (xcopy %%i c:%%~pi /Y)
 補充5:只要是 %~ 開頭的操作符號,都是檔案名的分離操作,具體請看 for /? 或語句7。

3.用/F參數將命令結果當作迴圈範圍
 語句如下
 
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

 例子6:把date /T輸出的"2009/02/05 星期四"拆掉然後轉換成"2009-02-05"
 語句6:
for /f "tokens=1,2,3 delims=/ " %i in ('date /T') do echo %i-%j-%k
2009-02-05
補充6:此例用到"options"的額外參數,"delims=xxx"指分隔符號的集合,此例分隔符號是"/"與" ",意思是把"2009/02/05 星期四"依分隔符號拆成"2009","02","05"等。"tokens=x,y,m-n"是變數指定的意思,此例是把拆出來的第一個變數指定給%i,第二個給%j,依此類推囉

4. 使用%~來加強完整檔案路徑的分離功能

 直接看語句與結果比較快啦
 語句7:
for /f "delims=" %%i in ("C:\WINNT\system32\drivers\etc\lmhosts.sam") do (
echo.
echo 一個完全符合的路徑名稱 %%~fi
echo 磁碟機字元 %%~di
echo 路徑 %%~pi
echo 檔名 %%~ni
echo 副檔名 %%~xi
echo 路徑只包含短檔名%%~si
echo 檔案屬性 %%~ai
echo 檔案的日期時間 %%~ti
echo 磁碟機字元與路 %%~dpi
echo 檔名與副檔名 %%~nxi
echo 含短檔名的完全路徑 %%~fsi)


一個完全符合的路徑名稱 C:\WINNT\system32\drivers\etc\lmhosts.sam
磁碟機字元 C:
路徑 \WINNT\system32\drivers\etc\
檔名 lmhosts
副檔名 .sam
路徑只包含短檔名C:\WINNT\system32\drivers\etc\lmhosts.sam
檔案屬性 --a------
檔案的日期時間 03/06/26 08:00p
磁碟機字元與路 C:\WINNT\system32\drivers\etc\
檔名與副檔名 lmhosts.sam
含短檔名的完全路徑 C:\WINNT\system32\drivers\etc\lmhosts.sam


5. 用/L參數來指定起始值終值的迴圈範圍
 這個跟一般程式很像囉,語句如下
 FOR /L %variable IN (start,step,end) DO command [command-parameters]

 例子8:假設我想ping一段ip範圍,如11.111.2.115~11.111.2.130,如有回應就印出該ip ok之類的
 語句8: 請把一個的"&"替換成shift+\囉,連續兩個的不用替換(blogger把我字給吃了)
for /L %%i in (115,1,130) do ping -n 1 11.111.2.%%i & find "reply" /i && echo 11.111.2.%%i ok

2009年1月16日 星期五

批次檔的執行條件處理IF

IF在批次檔中大概有3種格式,我配合我用過的例子作說明,如下:

1. IF [NOT] 參數==字串 command
參數如果等於指定的字串,則條件成立,就會運行命令
例子1:我有一個批次檔,每天排程執行,當遇到週日我想執行不一樣的命令, 內容要怎麼寫?


::取日期與星期幾
for /f "tokens=1,2" %%i in ('date /T') do set vard=%%i&& set vare=%%j
::判斷是否週日,如果是週日跳到另一段落
if %vare%==星期日 goto addsun
::下面執行非週日的命令
echo 執行非週日命令

exit
::下面執行週日的另令
:addsun
echo 執行週日命令


例子2:各位都知道windows排定的工作是可以細到每分鐘的執行一次的,那如果我排定一個批次檔是每天的九點開始執行,每小時執行一次,直到下午五點,批次檔會寫記錄到Log中,這樣排定,批次檔每隔一小時就執行一次,但是我想在這批次檔中作到第一次執行時,先把Log檔清空,怎麼作呢?


if %time:~0,2% EQU 9 echo. >c:\test.log
答案是利用時間囉,因為排程是時間是9點開始,那我判斷時間是9點才執行清檔就可以,簡單吧,系統時間%time%是20:29:11.04囉

2. IF [NOT] EXIST filename command

如果有指定的檔,則條件成立,就運行命令,通常用來測試檔案是否存在
例子:我把一個註冊表的機碼匯到暫存區的一個檔,那我希望在批次檔中判斷當此檔存在時,就無聲執行它,怎麼作?
if exist %temp%\addreg.reg regedit /s %temp%\addreg.reg
3. IF [NOT] ERRORLEVEL number command
DOS程式執行完都會傳回一個數字,稱為錯誤碼errorlevel或回傳碼,如果回傳碼等於指定的數字,則條件成立,就運行命令囉
例子:如果檔案複製成功,我希望LOG.txt就會顯示"成功複製檔案",否則就會顯示"檔案複製失敗"


XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 1 ECHO 成功複製檔案 >c:\LOG.txt
IF ERRORLEVEL 0 ECHO 檔案複製失敗 >c:\LOG.txt
IF ERRORLEVEL 是用來測試它的上一個DOS命令的回傳值的,注意只是上一個命令的回傳值喔,而且回傳值必須依照從大到小次序順序判斷,否則會出錯喔。


2008年12月25日 星期四

NUL的意義與用法

NUL是一個特殊的空設備,它沒有可控制的PC硬體或埠,可以說是一種虛擬的設備吧,有點像黑洞一樣,可以吞噬任何輸入輸出之請求而不給回應,就給你隱藏起來喔!


控制碼 1 表示標準輸出;控制碼 2 表示錯誤輸出!













1.看上圖,正常執行pasue命令,會顯示"請按任意鍵繼續...",然後等待你的下一步動作
2.若在後面接 1>nul 的話,就會將標準輸出隱藏囉
3.一般的move命令,若沒有檔案可移動,則會出現錯誤輸出"系統找不到指定的檔案
4.若在後面接 2>nul 的話,就會將錯誤輸出隱藏囉。

5.當然也可以後面接1>nul 2>nul ,就表示將所有輸出都隱藏,不過這樣感覺好像病毒的行為喔,故意讓你不知在作什!


6.我個人喜歡在batch裡這樣用1>log.txt 2>err.txt,這樣就不管任何訊息都會留下記錄囉,執行結果寫到log.txt,錯誤訊息寫到err.txt,方便我後續有問題時除錯囉,給各位參考!

對了,我好像沒有提到重定向">"的意義,自行去微軟參考吧http://technet.microsoft.com/en-us/library/bb490982.aspx





2008年12月23日 星期二

用xcopy快速複製目錄結構

今天剛好遇到一個問題,要怎麼只複製目錄結構,而不複製檔案呢?原本是打算用dir再配合for迴圈去作,但後來發現多此一舉,用xcopy本身就可以做到了!


xcopy /T /E source destination


xcopy功能非常多呢,下面是詳細的參數,自己看吧

XCOPY source [destination] [/A /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
[/C] [/I] [/Q] [/F] [/L] [/H] [/R] [/T] [/U]
[/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]\r\n [/EXCLUDE:file1[+file2][+file3]...]

source 指定要複製的檔案。
destination 指定位置或者/以及新檔案的名稱。
/A 只複製設定成保存屬性的檔案,不要改變屬性的設定。
/M 只複製設定成保存屬性的檔案,並清除保存屬性。
/D:m-d-y 複製在指定日期當天或之後發生變更的檔案。如果沒有給日期,
只複製那些來源檔案日期比目的檔案日期為新的檔案。
/EXCLUDE:file1[+file2][+file3]...
指定檔案清單字串。如果有字串對應到要進行複製的檔案絕對
路徑的任何部分,這個檔案會被排除複製。例如,指定字串
\obj\ 或 .obj 的話,會排除所有在 obj 目錄下副檔名是
.obj 的檔案複製。
/P 在建立每個目的檔案時顯示提示。
/S 複製每個目錄及其包含的子目錄,不複製空目錄。
/E 複製每個目錄及其包含的子目錄,也複製空目錄。/S 與 /E
相同,能夠用來修改 /T。
/V 驗證每個新檔案。
/W 在複製之前提示您按鍵繼續。
/C 如果錯誤發生時也繼續複製。
/I 如果目的不存在且複製一個以上的檔案的話,就假設指定的
目的一定是目錄。
/Q 在複製時不要顯示檔名。
/F 在複製時顯示來源及目的檔案的全部檔名。
/L 顯示要複製的檔案。
/H 時複製隱藏檔和系統檔。
/R 覆蓋唯讀檔案。
/T 建立目錄結構,但不複製其中的檔案。不包括空目錄及子目錄。
/T /E 會包括空目錄及子目錄。
/U 只複製已經存在目的位置的檔案。
/K 複製檔案屬性。通常 Xcopy 會重設唯讀的屬性。
/N 用所產生的短檔名來進行複製。
/O 複製檔案所有權及 ACL 資訊。
/X 複製檔案審查設定 (包含 /O)。
/Y 不要提示您確認是否要覆蓋一個已經存在的檔案。
/-Y 示您確認是否要覆蓋一個已經存在的檔案。
/Z 在可重新開始的模式中複製網路檔案。

參數 /Y 可以在 COPYCMD 環境變數中預先設定。但可以在指令行中用 /-Y 參數
來覆蓋原有設定。

2008年12月19日 星期五

用vbs發信很簡單

server上不需安裝smtp服務,但你必須有一發信帳戶就可以使用這個發信囉,發信時還可附加檔案或從文字檔讀取內容喔

2008年12月18日 星期四

Batch命令變數截取

看圖應該知道作什用的吧




下面是對岸高手製作的程式產生的,我直接把結果貼過來囉

變數var的值為: 0123456789ABCDEF

%var:~1,1% 截取之後的字元為: 1
%var:~1,5% 截取之後的字元為: 12345
%var:~1,9% 截取之後的字元為: 123456789
%var:~1,13% 截取之後的字元為: 123456789ABCD
%var:~4,1% 截取之後的字元為: 4
%var:~4,5% 截取之後的字元為: 45678
%var:~4,9% 截取之後的字元為: 456789ABC
%var:~4,13% 截取之後的字元為: 456789ABCDEF
%var:~7,1% 截取之後的字元為: 7
%var:~7,5% 截取之後的字元為: 789AB
%var:~7,9% 截取之後的字元為: 789ABCDEF
%var:~7,13% 截取之後的字元為: 789ABCDEF
%var:~10,1% 截取之後的字元為: A
%var:~10,5% 截取之後的字元為: ABCDE
%var:~10,9% 截取之後的字元為: ABCDEF
%var:~10,13% 截取之後的字元為: ABCDEF
%var:~13,1% 截取之後的字元為: D
%var:~13,5% 截取之後的字元為: DEF
%var:~13,9% 截取之後的字元為: DEF
%var:~13,13% 截取之後的字元為: DEF

%var:~1,-1% 截取之後的字元為: 123456789ABCDE
%var:~1,-4% 截取之後的字元為: 123456789AB
%var:~1,-7% 截取之後的字元為: 12345678
%var:~1,-10% 截取之後的字元為: 12345
%var:~1,-13% 截取之後的字元為: 12
%var:~5,-1% 截取之後的字元為: 56789ABCDE
%var:~5,-4% 截取之後的字元為: 56789AB
%var:~5,-7% 截取之後的字元為: 5678
%var:~5,-10% 截取之後的字元為: 5
%var:~5,-13% 截取之後的字元為:
%var:~9,-1% 截取之後的字元為: 9ABCDE
%var:~9,-4% 截取之後的字元為: 9AB
%var:~9,-7% 截取之後的字元為:
%var:~9,-10% 截取之後的字元為:
%var:~9,-13% 截取之後的字元為:
%var:~13,-1% 截取之後的字元為: DE
%var:~13,-4% 截取之後的字元為:
%var:~13,-7% 截取之後的字元為:
%var:~13,-10% 截取之後的字元為:
%var:~13,-13% 截取之後的字元為:

%var:~-2,1% 截取之後的字元為: E
%var:~-2,5% 截取之後的字元為: EF
%var:~-2,9% 截取之後的字元為: EF
%var:~-2,13% 截取之後的字元為: EF
%var:~-5,1% 截取之後的字元為: B
%var:~-5,5% 截取之後的字元為: BCDEF
%var:~-5,9% 截取之後的字元為: BCDEF
%var:~-5,13% 截取之後的字元為: BCDEF
%var:~-8,1% 截取之後的字元為: 8
%var:~-8,5% 截取之後的字元為: 89ABC
%var:~-8,9% 截取之後的字元為: 89ABCDEF
%var:~-8,13% 截取之後的字元為: 89ABCDEF
%var:~-11,1% 截取之後的字元為: 5
%var:~-11,5% 截取之後的字元為: 56789
%var:~-11,9% 截取之後的字元為: 56789ABCD
%var:~-11,13% 截取之後的字元為: 56789ABCDEF
%var:~-14,1% 截取之後的字元為: 2
%var:~-14,5% 截取之後的字元為: 23456
%var:~-14,9% 截取之後的字元為: 23456789A
%var:~-14,13% 截取之後的字元為: 23456789ABCDE

%var:~-1,-2% 截取之後的字元為:
%var:~-1,-5% 截取之後的字元為:
%var:~-1,-8% 截取之後的字元為:
%var:~-1,-11% 截取之後的字元為:
%var:~-1,-14% 截取之後的字元為:
%var:~-5,-2% 截取之後的字元為: BCD
%var:~-5,-5% 截取之後的字元為:
%var:~-5,-8% 截取之後的字元為:
%var:~-5,-11% 截取之後的字元為:
%var:~-5,-14% 截取之後的字元為:
%var:~-9,-2% 截取之後的字元為: 789ABCD
%var:~-9,-5% 截取之後的字元為: 789A
%var:~-9,-8% 截取之後的字元為: 7
%var:~-9,-11% 截取之後的字元為:
%var:~-9,-14% 截取之後的字元為:
%var:~-13,-2% 截取之後的字元為: 3456789ABCD
%var:~-13,-5% 截取之後的字元為: 3456789A
%var:~-13,-8% 截取之後的字元為: 34567
%var:~-13,-11% 截取之後的字元為: 34
%var:~-13,-14% 截取之後的字元為:

有的變數截取之後值為空,這是正常的

如何用FTP自動傳送文件

FTP命令我就不多說,上網查或自行在命令列模式,先輸入ftp再輸入help即可得知

1.先建立一個文字檔,存成ftpcmd.txt,內容如下,請自行替換
open 11.10.2.xxx
帳號

密碼

binary
put D:\dbbk.zip
bye

有沒有注意到我的帳號跟密碼下一行都是空白,有的情況可以不用空,有的情況要,請自行測試囉

2.在命令列模式下,輸入
ftp -s:d:\ftpcmd.txt

此例ftpcmd.txt在D槽

3.配合排程,就可以自動傳送囉

順便再介紹一個在ftp裡面可以使用其他DOS命令的方法,用"!"囉
! Escape to the shell

下面的例子,把c槽dirtmp.log移動到d槽囉
!move c:\dirtmp.log d:\

這樣了吧