接收鍵盤輸入字元串的程式
:: 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,如需轉載請自行聯系原作者