2013-11-20 248 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