批处理文件 - 忽略子批处理文件中的CLS

时间:2013-11-20 22:50:57

标签: batch-file

我正在创建一个批处理文件,该文件将调用其他一些批处理文件。其中一个要调用的批处理文件中包含“CLS”。有没有什么方法可以让包装批处理文件忽略子“CLS”调用,同时当直接从命令行调用子批处理文件时仍然让CLS工作?

3 个答案:

答案 0 :(得分: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 :(得分: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

将输出转向外部控制的目的地。

似乎有许多方法可以应用一个简单的概念。

答案 2 :(得分:1)

您可以创建一个临时批处理文件,其中忽略了所有cls命令:

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

这应该做你想要的完美。

莫纳