【问题标题】:Usage of # with SET in batch programs在批处理程序中使用 # 和 SET
【发布时间】:2019-03-31 09:52:19
【问题描述】:

我正在寻找一种批量获取字符串长度的方法。所以我从 jeb 读了answer,其中包含一些我不明白的神秘迹象。

在检索输入字符串时,他在函数strlen 中使用井号(#):

:strlen <resultVar> <stringVar>
(   
[...]
    set "s=!%~2!#"
[...]
)

有人能解释一下井号是什么意思吗? 据我了解,!%~2! 给出了调用的第二个参数。但是# 是干什么用的?为什么SET 后面的表达式会被" 括起来?

【问题讨论】:

  • 最好用引号将SET 命令括起来。它保留特殊字符并防止您在命令末尾可能看不到的任何尾随空格。为什么不在 Jeb 的回答下方发表评论,问他的目的,而不是问你的问题。他经常来这里,可能会在一天之内回复你。
  • :label 之后,空格可以是任何信息 - 它被忽略。在这里它表示子例程/函数期望的参数:&lt;resultVar&gt; &lt;stringVar&gt; 两者都通过引用。附加的# 是 IMO 那里通过添加一个字符将基于零的偏移量计算转换为长度。
  • # 没有特殊含义。它只是一个字符,例如aset 命令只是将该字符附加到给定的字符串(可能是因为 LotPings 提到的原因)。
  • @LotPings,如果我没记错的话,我相信 Jeb 的速度会更快。我知道几年前在 DosTips 上讨论过它。
  • Dbenham 对SS64上使用的所有常用算法进行了深度速度测试

标签: batch-file window


【解决方案1】:

我在strlen函数中使用了哈希字符#来解决两个问题。

对于空(未定义)变量,使用 :~n,m snytax 拆分变量失败,附加一个字符可以防止该问题。

并且算法的结果是字符串长度减去s变量之一,通过附加一个字符来补偿结果。

我为什么使用哈希?
我能记住的唯一原因是使用一个没有任何特殊批处理功能的字符,而且它很醒目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2014-11-10
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多