我正在创建一个批处理文件,该文件将调用其他一些批处理文件。其中一个要调用的批处理文件中包含“CLS”。有没有什么方法可以让包装批处理文件忽略子“CLS”调用,同时当直接从命令行调用子批处理文件时仍然让CLS工作?
答案 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
这应该做你想要的完美。
莫纳