在批处理文件中使用'#'(井号)

mec*_*ynx 3 windows batch-file

我遇到了一个批处理文件(portableshell.bat来自草莓Perl的便携版)使用#,我无法理解为什么.我在网上搜索过,但似乎没有提及这种用法.我需要模仿批处理文件的功能,但我很谨慎,不知道它究竟做了什么.

这里的目的是什么#:

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%
Run Code Online (Sandbox Code Playgroud)

和这里:

if not #%1# == ## "%drivep%\perl\bin\perl.exe" %* & goto END
Run Code Online (Sandbox Code Playgroud)

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

mec*_*ynx 6

#字符存在,以便在比较中正确处理null/undefined值,即避免在变量对它们进行求值时与未定义值进行比较.

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

据dbenham在评论中说,使用其他任何东西""一般都是不好的做法.当变量有自己的引号时,引号可能会失败,但当扩展变量不能拥有引号时,引用会很安全,就像展开路径时一样.在所有情况下安全的唯一方法是延迟扩张.

此外,没有理由使用#[使用其他任何内容包围变量扩展.在问题的批处理文件的情况下,它显然只是为了对称.

关于这一点可以在这个问题中阅读.

感谢CodeCaster的帮助

  • 我强烈建议使用`""`来"隐藏"特殊字符:例如,`if#&#== ##`因为`&`(命令连接字符)而失败,但是`if'& "==""`将起作用,因为`&`被包含在`""中并且因此将被字面处理... (5认同)
  • 使用除引号之外的任何内容通常都是不好的做法,但不幸的是,这是一个常见的做法.我确信第二个`#`是对称的,但它没有任何实际意义.如果值包含其自己的引用,即使引号也会失败,但保证此特定用法不具有引号.在所有情况下唯一绝对安全的方法是使用延迟扩展. (3认同)
  • @ivy_lynx"Strawberry Perl"中的实现容易出错.当当前目录在`C:\ Projects&etc\Strawberry`中包含`&`时失败.引用应始终使用目录是安全的,"set"drive =%~dp0"` (2认同)