语言 Batch

前言

以前我一直不明白为什么那么多应用程序在读取“文件路径”作为参数时为什么总是在正式的“文件路径”前要加上个“-f”、"-d"、"-file"以及“-path”之类的引导参数,以为只是纯粹的装帅,或者增加程序使用的代入感,亦或者是便于理解之类的。所以,我写的程序中也常常会带一些引导参数。

知道今天,我终于发现了这个小秘密...虽然触发条件很苛刻(也不是很少见),但稍不留神就会遇到。然后,一分钟过去了,一小时也过去了...无助的看着自己的项目,再看看网上一堆抄过来又抄过去的,甚至是抄烂了的文章、博客...哎~洗洗睡吧...

BUG 详情

  1. 这是我写的一个项目,作用是计算文件的 Hash 码校验文件。在这里最重要的两个参数,一个是文件路径,一个是文件校验的 Hash 码类型

  2. 目前使用的是批处理作为引导传递参数,用于调试程序。

  3. 在批处理中,第一个参数用于读取“文件路径”,第二个参数用于读取“Hash码类型”。然后,由批注里将参数传递给程序用于计算 Hash 校验码。

  4. 使用命令如图

百度找不到,但高手都知道(感觉他们都知道)的一个小细节--BUG调试报告-LMLPHP

很显然,这个 “A TEST” 文件夹中间存在空格,不好处理。

因为通常在参数中加上了双引号后基本不用考虑这个空格的出现,但奇怪的BUG就这么出现了...

这是执行结果:

百度找不到,但高手都知道(感觉他们都知道)的一个小细节--BUG调试报告-LMLPHP

???
显然,中间的空格还是被当作参数的 分隔符 看待了,从而导致“文件路径”参数只传递了一半,另一半被当作“Hash码类型”处理返回了这样的错误信息。

这个问题我也查了一下,的确由很少一部分人也遇到了。但几乎都没有一个确切的解决办法和问题原因的解释,这让人很难受。

我加过各种符号,几乎都没有起作用。

我想了想为什么以前没有遇到过这个问题?

最后,我把 %1 %2 这两个参数的读取调换了个位置--解释一下
{
    原:
        %1 --- 文件路径
        %2 --- Hash码类型
    现:
        %1 --- Hash码类型
    %2 --- Hash码类型
}

然后就....

百度找不到,但高手都知道(感觉他们都知道)的一个小细节--BUG调试报告-LMLPHP

然后就解决了,是的,解决了...

经过反复确认,最后得到一条结论:

在传递参数时,第一个参数最好不要传递“文件路径”之类的可能包含空格的参数。不然,中间出现 空格 的话,无论你是否添加双引号都会被分割成两个参数。

当然,这也时经验之谈。就像古代的农夫种庄稼一样,虽然不是什么惊世伟学,但有时候他就是那么“”。

底层的原理我还不明白,网上有的人说是跟操作系统有关(我感觉是瞎掰...)。也不知大前辈们是否都知道这个问题才使用引导参数的,还是向我之前一样...亦或者根本没有这个BUG,只是我遇到了这个奇怪的情况...谁知道呢?Who knows?

当然如果你清楚原理的话,还望能不吝赐教!在下在这先谢过了...<( _ _ )>

结论

Batch 中第一个参数最好不要设置为可能包含空格符的参数。因为在 CMD 按程序名称调用时含空格的第一个参数无论是否使用双引号包裹还是会被当成两个看待。

原创说明

原文作者:SeaFever
转载请务必注明出处!我本人保留所有权利!
原文链接:https://www.cnblogs.com/seafever/p/12695076.html

04-14 10:19