今天寫一個批次檔發現執行EXE時候視窗還會留著


網路上查了一下, 目前只有用到start..以後也許還會用到其他的 筆記一下

資料從這來的: http://pheobus7.wordpress.com/2011/02/08/%E9%80%8F%E9%81%8Ebat-bat%E7%A8%8B%E5%BC%8F%E5%82%B3%E9%81%9E%E5%8F%83%E6%95%B8%E7%B5%A6windows%E7%A8%8B%E5%BC%8F-exe%E4%B8%A6%E8%87%AA%E5%8B%95%E9%97%9C%E9%96%89%E5%9F%B7%E8%A1%8Cbat%E6%AA%94/

透過Bat(*.bat)程式傳遞參數給Windows程式(.Exe)並自動關閉執行Bat檔時的Doc視窗(转)



Filed under: pc软件 — 发表评论

02月 8, 2011







Code:(*.Bat)
start c:\Test.exe %1

@Echo Off
cls
EXIT


說明:
1. %1 為呼叫Bat程式時傳遞Bat程式的第一個參數(%2、%3..%9分別表示第2、第3、…、第9個參數)
2. 使用start去啟動Exe程式,可以不必等Exe程式執行結束,Bat的Dos視窗就可以關閉
3. 
@Echo Off 及 cls 指令用來關閉Bat的Dos視窗(經測試發現,不加Exit指令也可以)
4. Windows程式接收命令行參數的方法如下(以C#為例):
System.Environment.GetCommandLineArgs().GetValue(1).ToString()
註:GetValue(1)表示接收第1個參數,依次類推可以接收第2、3個參數


P.S.
批處理程式(.Bat)相關知識:
1. 
假设父批处理程序接收两个可替换参数,并希望将它们传给Sub.bat。可在父批理程序中使用命令:call Sub.bat%1%2
2. 設置變量,並等待使用者輸入:set /p Name = 請輸入使用者名稱(註:/p 讓執行暫停,並提供使用者輸入的機會)
3. 取得變量值:%變量名稱%
4. 輸出變量值:如:echo 您輸入的使用者名稱為:%Name%
5. 執行時不顯示指令程式碼:@echo off
6. 暫停:pause
7. 註解:::
8. 批参数(%n)的替代已被增强。可以使用以下语法:
%~1        – 删除引号(“),扩充 %1
%~f1        – 将 %1 扩充到一个完全合格的路径名
%~d1        – 仅将 %1 扩充到一个驱动器号
%~p1        – 仅将 %1 扩充到一个路径
%~n1        – 仅将 %1 扩充到一个文件名
%~x1        – 仅将 %1 扩充到一个文件扩展名
%~s1        – 扩充的路径指含有短名
%~a1        – 将 %1 扩充到文件属性
%~t1        – 将 %1 扩充到文件的日期/时间
%~z1        – 将 %1 扩充到文件的大小
%~$PATH : 1 – 查找列在 PATH 环境变量的目录,并将 %1
扩充到找到的第一个完全合格的名称。如果环境
变量名未被定义,或者没有找到文件,此组合键会
扩充到空字符串

可以组合修定符来取得多重结果:
%~dp1      – 只将 %1 扩展到驱动器号和路径
%~nx1      – 只将 %1 扩展到文件名和扩展名
%~dp$PATH:1 – 在列在 PATH 环境变量中的目录里查找 %1,
并扩展到找到的第一个文件的驱动器号和路径。
%~ftza1    – 将 %1 扩展到类似 DIR 的输出行。

Sample 1:以下的程式碼片段(*.bat)可以取得目前系統時間的年、月、日、時、分等欄位,當在做一些自動化備份時,可以用時間來當檔名或留下 TIMESTAMP 紀錄。

@echo off
cls

:: 取得今天日期的年、月、日三個欄位(透過 date /t 指令取得)
for /f “tokens=1-4 delims=-/ ” %%i IN (‘date /t’) DO (
set year=%%i
set month=%%j
set day=%%k
)

:: 取得當下時間的時、分兩個欄位
for /f “tokens=1-3 delims=:” %%i IN (‘time /t’) DO (
set hour=%%i
set minute=%%j
)

:: 濾掉 hour 前面可能會出現的空白
for /f “tokens=1 delims= ” %%i IN (“%hour%”) DO (
set hour=%%i
)

Sample 2:以下的程式碼片段(*.bat)可以取得目前系統時間的年、月、日、時、分等欄位,當在做一些自動化備份時,可以用時間來當檔名或留下 TIMESTAMP 紀錄。

@echo off
@For /f “tokens=1-3 delims=/ ” %%a in (‘date /t’) do (set date=%%a-%%b-%%c)
@For /f “tokens=2-3 delims=: ” %%a in (‘time /t’) do (set time=%%a:%%b)
@echo DayTime : %date% %time%

Sample 3:Batch 檔取得系統的日期、時間欄位

取得今天日期 ( 其中 P0 代表「不滿 10 自動補零」的意思 )

REM 取得今天的年、月、日 (自動補零)
SET TodayYear=%date:~0,4%
SET TodayMonthP0=%date:~5,2%
SET TodayDayP0=%date:~8,2%

REM 取得今天的年、月、日 (純數字)
SET /A TodayMonth=TodayMonthP0+0
SET /A TodayDay=TodayDayP0+0

echo 日期 %TodayYear%/%TodayMonth%/%TodayDay%
echo 日期 %TodayYear%/%TodayMonthP0%/%TodayDayP0%取得上個月的年、月 ( 其中 P0 代表「不滿 10 自動補零」的意思 )

REM 取得上個月的年、月
SET /A LastMonthYear=%TodayYear%+0
SET /A LastMonthMonth=%TodayMonth%-1
SET /A LastMonthMonthP0=%LastMonthMonth%
REM 修正年份與月份的數值
IF %LastMonthMonth% EQU 0 (SET /A LastMonthYear=%thisYear%-1)
IF %LastMonthMonth% EQU 0 (SET LastMonthMonth=12)
IF %LastMonthMonth% LSS 10 (SET LastMonthMonthP0=0%LastMonthMonth%)

echo 日期 %LastMonthYear%/%LastMonthMonth%
echo 日期 %LastMonthYear%/%LastMonthMonthP0%取得當下時間 ( 時、分、秒、豪秒 )

REM 取得時、分、秒 、豪秒
SET Hour=%NowTime:~0,2%
SET Minute=%NowTime:~3,2%
SET Second=%NowTime:~6,2%
SET /A Millisecond=%NowTime:~9,2%*10

echo 時間 %Hour%:%Minute%:%Second%.%Millisecond%上述關於取得「上個月」的年、月的重點就在於 Batch 可以提供基本的數學運算。另外對於 %time% 的精準度只有到「百分之一秒」,為了改以表達「豪秒」表達所以我將取得的數字乘以 10 處理。

如何在批次檔(Batch)中實現 sleep 命令讓任務暫停執行 n 秒
在批次檔(*.bat)中內建並沒有 SLEEP 命令,當你在執行批次任務時若需要暫停執行幾秒鐘,就需要一些小技巧來實現了,以下分享幾個我之前用過的技巧:
1. 利用 PING 指令幫忙停 5 秒
每壹台電腦都有 PING 執行檔,這個最好用啦!
@ping 127.0.0.1 -n 5 -w 1000 > nul

2. 利用 CHOICE 指令
CHOICE 命令在 Windows XP 中找不到,但在 Windows Server 2003 或 Vista 都有內建。
@CHOICE /C YN /N /T 5 /D y > nul

3. 安裝 Windows Server 2003 Resource Kit Tools 即可獲得 sleep.exe 工具
預設安裝路徑在 C:\Program Files\Windows Resource Kits\Tools 目錄下會有個 sleep.exe 執行檔
sleep 5




arrow
arrow
    全站熱搜
    創作者介紹
    創作者 zealot0515 的頭像
    zealot0515

    瘋狂記事簿

    zealot0515 發表在 痞客邦 留言(0) 人氣()