2013-11-20 287 views
2

我正在創建一個批處理文件,它將調用其他一些批處理文件。其中一個要調用的批處理文件中有一個「CLS」。有沒有什麼方法可以讓包裝批處理文件忽略子項「CLS」調用,同時仍然允許CLS在從命令行直接調用子批處理文件時工作?批處理文件 - 忽略子批處理文件中的CLS

回答

4

這裏是一個真正的醜陋的黑客:-)如果stdout被重定向到con:

的CLS屏幕命令不起作用 - 它打印換頁符(0x0C)到屏幕上。在我的機器上,它看起來像女性的象徵。

@echo off 

:: Normal call, CLS in called batch clears the screen 
call batch2 

:: Redirected call, CLS in called batch prints <FF> character to screen (without newline) 
call batch2 >con: 

優點 - 無需修改您的子腳本。

缺點 - 不想要的<FF>字符出現在輸出中。

1

您可以創建一個臨時批處理文件,所有cls命令已經ingnored:

setlocal enabledelayedexpansion 
set target=targetname.bat 
for /f "usebackq delims=" %%a in ("%target%") do (
set line=%%a 
Echo !line:cls=Rem Cls! >> temp_%target% 
Echo !line:CLS=Rem Cls! >> temp_%target% 
Echo !line:Cls=Rem Cls! >> temp_%target% 
Rem Include CLs ClS cLS, etc. if the person who wrote the file is not case consistent 
Rem : ( 
set line= 
) 
call temp_%target% 
set target= 
Endlocal 

這應該做你想要什麼完美。

蒙娜麗莎

2

嗯 - 挺多久IS一條繩子?

一般情況下,你可以在你的CALL版批量試試這個:

@echo off 
setlocal 
set skipcls=%1 
if defined skipcls (if "%skipcls%"=="::" (shift) else (set "skipcls=")) 
... 
%SKIPCLS% cls 
... 

然後打電話給你批一個額外的第一個參數::

如果第一個參數是::它會被移出並skipcls將被設置爲::;否則skipcls將是空的,因此%skipcls% CLS線將被跳過或執行...


修訂:

也許

@echo off 
setlocal 
if "%~1"=="::" (shift&set "skipcls=REM ") else (set "skipcls=") 
... 
%SKIPCLS% cls 
... 

會更簡單。將skipcls設置爲REM SPACE而不是::將允許在括號內的結構中更加可靠地使用該技術。

當然,另一種方法是在調用程序中適當地設置skipcls

或者設置skipcls到你喜歡和使用

if [not] defined skipcls ... 

一樣,如果它的設置做到這一點,它支持結構,如果不做任何非空值。

當然,它並不侷限於CLS,所以應該使用不同的變量名稱。

如果你真的喜歡冒險的感覺,你可以在主叫方設置redirect>>"a_filename",然後有

%redirect% ECHO whatever 

轉向輸出到外部controled目的地。

似乎是許多方法來應用一個簡單的概念。

+0

用戶想知道如何避免忽略'cls'而不需要手動做到這一點:如果他想這樣做,他可以在記事本中做'Ctrl + H'並用'Rem cls'或' :: cls'。此外,爲什麼他會這麼做呢,因爲與'::'或'rem'相比,鍵入'%SKIPCLS%'要長很多且平淡無奇。來自我的'-1'。 – Monacraft

+1

@Monacraft - 至少Magoo的解決方案是參數化的。可以在啓用或禁用CLS的情況下調用相同的腳本,而無需更改代碼;只是CALL需要改變。但是可選地將變量CLS定義爲CLS或未定義更簡單。然後在腳本的主體中簡單地使用%CLS%。 – dbenham