天天看點

精彩批處理代碼

接收鍵盤輸入字元串的程式

:: Get user input - includes error check

@echo off

echo e102'set %%1='> %temp%.\t1.dat

for %%? in (w q) do echo %%?>> %temp%.\t1.dat

:input

echo.

echo Type input:

FC con nul /lb1 /n |FIND "1:" > %temp%.\t2.bat

:: Error checking begins here

FIND "|" %temp%.\t2.bat > nul

if not errorlevel=1 goto error

FIND "=" %temp%.\t2.bat > nul

FIND " nul

FIND ">" %temp%.\t2.bat > nul

:: Error checking end

DEBUG %temp%.\t2.bat  nul

call %temp%.\t2.bat 字元串

for %%? in (t1.dat t2.bat) do del %temp%.\%%?

echo 字元串=%字元串%

goto eof

:error

echo @PROMPT Invalid input. Invalid characters: $Q $L $G $B$_> %temp%.\t2.bat

%comspec% /c %temp%.\t2.bat |FIND ":"

goto input

:eof

一個修改檔案的更新日期的程式

@echo off 

rem 儲存系統時間 

echo.|date>sysdate.bat 

echo.|time>systime.bat 

rem 修改系統時間為指定時間,日期為參數一,時間為參數二,檔案名為參數三 

date %1 

time %2 

rem 修改檔案的時間 

copy %3+,,>nul 

rem 恢複系統時間 

echo date %%4>current.bat 

call sysdate 

echo time %%3>current.bat 

call systime 

rem 程式執行完畢 

echo Success. 

del systime.bat 

del sysdate.bat 

del current.bat 

echo on 

PING某個區段内的所有IP的程式

  在指令行輸入 a.bat 0 1 2 3 4 5 6 7 8 9 ,就能顯示某區段的所有 IP 位址 192.168.1.0 - 192.168.1.99 ,将其中的 echo 改成 ping 就行,其中的 choice 和 if 語句是等待使用者判斷是否繼續,可以删除,但這樣中斷程式比較麻煩。

CODE:  [Copy to clipboard]

--------------------------------------------------------------------------------

:redo 

if "%1" == "" goto end 

for %%a in (0,1,2,3,4,5,6,7,8,9) do echo 192.168.1.%1%%a 

choice continue 

if errorlevel 2 goto end 

shift 

goto redo 

:end

一個定時器程式

程式中的 CURRENT.BAT 可以更換為自己需要執行的内容。FIND 一句的時間可以根據自己的需要設定,也可用參數%1代替。還可以改為 TIME 改為 DATE 以完成的定期執行的功能。

------------------------------

  Quote: 

::CURRENT.BAT

echo Haha, it's the time to go!!

::TIMER.BAT

:start 

echo.|time|find "10:30:00">run.bat 

choice /c:y /t:y,59 /n>nul

call run.bat 

goto start 

ASCII彙編代碼,延遲精度為0.001秒,适用平台為MS-DOS/Win9x/WinNT。

  德國人Herbert Kleebauer給出了一個通用方案,通過ASCII彙編器間接産生一個sleep.exe程式來實作延遲,這個程式分為DOS和Win兩個子產品,分别調用DOS系統中斷服務和WindowsAPI。

:: Sleep.bat - Sleep/Delay/Wait n seconds

:: Herbert Kleebauer(Germany) - 2005/05/29

:: Modified by Will Sort - 2005/06/02, 07-25

echo q | debug>nul

echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>sleep.com

echo dsmSQswDOR[BQAQ?LUA?_L_oUNUScLOOuLOODUO?UOE@OwH?UOQ?DJTSDM>>sleep.com

echo @dmTkRQSoddTT~?K?OCOQp?o??Gds?wOw?PGAtaCHQvNntQv_w?A?it\EH>>sleep.com

echo Q??PGT~B??OC~?ipO?T?~U?p~cUo0x>>sleep.com

sleep.com>sleep.exe

echo wait %1 seconds:

sleep.exe %1000

del sleep.com

del sleep.exe

時鐘(Clock)

1、暫停(Pause)、延遲(Delay)、等待(Wait)、睡眠(Sleep)

1)for+set+if,時間精度為0.01秒,适用平台為WinNT/2K/XP/2003。

  利用for解析變量%time%并存為兩個時間點%start%和%now%,再利用set /a計算兩個時間點的時間差,最後用if判斷時間差是否達到設定的暫停時間。

  @echo off

  setlocal enableextensions

  echo %time%

  call :ProcDelay 200

  goto :EOF

  :ProcDelay delayMSec_

  for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k

    :_procwaitloop

    for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k

    set /a diff_=%now_%-%start_%

  if %diff_% LSS %1 goto _procwaitloop

  endlocal & goto :EOF

如何删除所有的空目錄?

用這個批處理就可以了。

dir /ad/b/s c:\ |sort /r >c:\kill.txt

For /f "tokens=*" %%i in (c:\kill.txt) DO rd "%%i"

del c:\kill.txt

我想用ECHO向另一P批處理檔案寫入“%~dp0”字元,可是被翻譯成路徑寫入了,而不是該字元本身,不知各位高手是否有辦法??

eg:

echo “%~dp0”>test.bat

試試:

echo "%%~dp0">test.bat

檔案名中的擴充名的判定

7.如何在批進行中判斷檔案字尾?實作諸如以下的效果。

if "%1" == "*.dll" goto dll

if "%1""=="*.inf" goto inf

1、如果檔案名所指的檔案是單個檔案,且存在這個檔案,且其中不包含路徑的指定,那麼可以使用以下的方案

for %%x in (*.dll) do if exist "%1" goto dll

for %%x in (*.inf) do if exist "%1" goto inf

2、如果檔案名所指的檔案是單個檔案,但是它不存在,且其中不包含路徑的指定,那麼可以使用以下的方案

if not exist %temp%\_getext_\nul md %temp%\_getext_

echo _getext_> %temp%\_getext_\%1

if exist %temp%\_getext_\*.dll goto dll

if exist %temp%\_getext_\*.inf goto inf

3、如果程式應用環境是NT系列的指令行,且檔案名中隻有一個分隔主檔案名和擴充名的句點,可以使用以下的方案

for /f "delims=. tokens=2" %%x in ("%1") do set _ext=%%x

if "%_ext%"=="dll" goto dll

if "%_ext%"=="inf" goto dll

目錄的存在判定

這似乎是個很簡單的問題,在我見過的和我編過的絕大部分批進行中,目錄判定都使用的是這個經典格式:

      if exist directory\nul command argument(s)

      可以說,這個技巧的創始者确實對DOS的研究十分深刻,至少他發現了 nul 所代表的裝置管理機制與檔案管理機制之間複雜而微妙的關系,nul裝置與. 和 .. 等一樣可以在大部分路徑下直接引用而不會産生系統錯誤。

      但是,也正像 .. 不能在根目錄下引用(這在NT CMD中被修改了)一樣,nul也有它的局限性。

      當我們在 MSDOS7.10 的環境中加載了 DOSLFN 以實作長檔案名支援時, DOSLFN 的某些 BUG 會将 \NUL 的引用轉義,此時會将檔案判定為目錄。

C:\>echo.>test.txt

C:\>if exist test.txt\nul echo Exist dir "test.txt"

Exist dir "test.txt"

C:\>

如果說這僅僅是doslfn的問題,那麼我們可以禁止DOSLFN,然後再将測試陣地轉到CD光牒上。由于CD光牒具有獨特的檔案系統CDFS,\NUL的引用失效了,目錄仍然無法被識别出來,不過總算不會把檔案誤判作目錄了。

E:\>dir /ad /b

BOOT

DOS71

E:\>if exist boot\nul echo Exist dir "BOOT"

E:\>

C:\>md "my test"

C:\>if not exist "my test"\nul echo Not exist "my test"

Not exist "my test"

C:\>if not exist "my test\nul" echo Not exist "my test"

C:\> 

關于目錄的存在判定

用 if exist directory\nul command argument(s)

的方法隻要目錄含有空格無論如何是比對不正确的。

我實際應用中一般用下面的方法:

md "my test"

cd "my test" &&echo Exist directory "test"

這樣會很準确,但也是有缺點的,那就是會進入其目錄

引用環境變量中路徑時的防禦字元的選擇

另一個與此相關的問題是,路徑變量後的防禦字元。

  當我們使用環境變量引用一個路徑時,一般是直接引用,比如:

  %temp%\_temp.bat

  但這樣存在一個問題:如果%temp%是某個驅動器的根目錄,比如C:\,那麼以上的引用就變成了:

C:\_temp.bat

  路徑中出現了雙斜線,這在MS-DOS和Win9x中将會引起文法錯誤,是以有人采用了在變量後加一個句點的做法,即:

  %temp%.\_temp.bat

  這樣的話,如果%temp%為根目錄,引用結果就是:C:\.\_temp.bat,如果不是根目錄(比如C:\temp),就是C:\temp.\_temp.bat。

  這利用了句點在不同用法中所呈現出的二義性:在前一用法中,它表示目前目錄,而根目錄下的目前目錄自然仍然是根目錄;而在後一用法中,它表示目錄名中主名與擴充名的分隔符,因為句點後沒有實際的擴充名,是以C:\temp.仍然表示的是C:\temp目錄。

  但是,這帶來了一個新問題:如果路徑中出現了相對路徑的特殊引用符,該怎麼辦?比如,如果%temp%是表示目前目錄的 . 或者上一級目錄的 ..,那麼 %temp%.\_temp.bat 的引用就變成了:

  ..\_temp.bat 或者 ...\_temp.bat

  這顯然又不是我們所需要的結果,那麼我們該怎麼辦呢?

  答案在你們的手裡 :-)

本文轉自海天一鷗部落格園部落格,原文連結:http://www.cnblogs.com/sgsoft/archive/2010/09/12/1824279.html,如需轉載請自行聯系原作者

繼續閱讀