2016-03-08 144 views
2

我遇到了使用#的批处理文件(来自便携式版本Strawberry Perlportableshell.bat),我无法理解为什么。我在网上搜索,但似乎没有提及这种用法。我需要模仿批处理文件的功能,但我很警惕不这样做,而不理解它到底做了什么。在批处理文件中使用'#'(井号)

什么的#这里的目的:

set drive=%~dp0 
set drivep=%drive% 
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1% 

这里:

if not #%1# == ## "%drivep%\perl\bin\perl.exe" %* & goto END 

(这里是整个文件的pastebin,仅供参考)

+2

为了在比较中空格处理和妥善处理空值。 – CodeCaster

+0

@CodeCaster所以它不会做任何事情而不是模仿一个角色?我是否正确地理解了它,如果我说'#'没有功能,除非是非空白的非功能性字符? – mechalynx

+2

是的。你不能比较一个值,比如'null',因为这在批处理文件中不起作用。另见http://stackoverflow.com/questions/5683583/windows-batch-files-if-else。你几乎可以使用任何你喜欢的字符,所以'如果不是[%1] == []'也可以。 – CodeCaster

回答

6

#性格是有这么在比较中正确处理空值/未定义值,即避免将变量ev与未定义值进行比较对他们有好处。

这个目的可以用于几乎任何角色(只要它在这种情况下没有其他含义)。常见的选择是[]{}。也可以使用""

根据dbenham的评论,使用除""以外的任何东西通常是不好的做法。当变量具有自己的引号时,引号可能失败,但当展开的变量不能拥有引号时(如展开路径时),引号是安全的。在所有情况下安全的唯一方法是delayed expansion

同样,没有理由以包围变量扩展与#[或任何被使用。在问题的批处理文件的情况下,显然只是为了对称。

更多关于此的可以阅读in this question

感谢CodeCaster的帮助

+5

为了“隐藏”特殊字符,我强烈推荐使用'“”''例如'if#&#== ##'将因'&'(命令串联字符)而失败,但'if' &“==”“'会起作用,因为'&'被封闭在''”'中,因此会被直接处理...... – aschipfl

+0

@aschipfl注意到,但我只是想明白这是什么。我不认为'#'也是一个好主意,因为它让人感到困惑。另一方面,可能会出现''''混淆的情况,我想是由编码人员来决定使用什么 – mechalynx

+0

@dbenham已经更正了 – mechalynx