【问题标题】:Batch Script - Comma causing problems when writing numerical value to txt file批处理脚本 - 将数值写入 txt 文件时逗号导致问题
【发布时间】:2015-11-26 10:19:24
【问题描述】:

因此,这是我正在编写的脚本示例,用于生成 txt 文件,其中包含要传递给另一个系统的正确格式命令列表,基于一系列问题。

如果为 objectNameobjectNumberobjectCategory 分配了一个字母数字值,则脚本将正确写入 txt 文件。但是,如果我要分配一个数值,则该值不会写入 txt 文件。

我猜这是与使用逗号有关的语法问题,因为我可以用几乎任何东西替换它,脚本会正常运行,但不幸的是它必须是逗号。

@ECHO OFF

SET objectCounter=1

SET /p objectName=What is the name of the object %objectCounter%?: 
@ECHO OBJECTNAME%objectCounter%,%objectName%> objects.txt

SET /p objectNumber=How many of object %objectCounter% are there?: 
@ECHO OBJECTNUMBER%objectCounter%,%objectNumber%>> objects.txt

SET /p objectCategory=Which group does object %objectCounter% belong to?: 
@ECHO OBJECTCATEGORY%objectCounter%,%objectNumber%>> objects.txt

如果为objectNumber 分配了1 的值,这是一个输出到txt 文件的示例:

OBJECTNAME1,Apple
OBJECTNUMBER1,
OBJECTCATEGORY1,Fruit

如果objectNumber 被分配了2 或更大的值,这是一个输出到txt 文件的示例:

OBJECTNAME1,Apple
OBJECTCATEGORY1,Fruit

【问题讨论】:

  • 这是否放在括号中(例如在 FOR、IF 或代码块中)?
  • 不,不是那样的。应该吗?
  • 如果您正在考虑使用 ^, 来转义逗号,我已经尝试过了 - 不走运。
  • >>> 之前放置一个空格。我相信您的 %objectNumber% 变量会导致 redirection 出现问题,尽管我有点困惑为什么当 objectNumber 为 2 时会出现 ObjectCategory 行。

标签: string batch-file scripting dos string-concatenation


【解决方案1】:

看起来它与在连接中的输出重定向和逗号有关。我认为,使用逗号,数值被绑定到重定向而不是输出的东西。

换句话说,当:

set x=1
echo xyzzy%x%>qq.txt

会起作用(输出的东西是xyzzy%x%,重定向为>qq.txt),以下不会:

set x=1
echo xyzzy,%x%>qq.txt

(大概是因为输出的东西是xyzzy,,重定向操作1>qq.txt>qq.txt相同)。这也解释了您在 1 和其他数字之间看到的差异,因为 1 是标准输出。

即使没有变量扩展你也可以看到类似的问题:

C:\pax> echo xyzzy1>qq.txt
C:\pax> type qq.txt
xyzzy1

C:\pax> echo xyzzy,1>qq.txt
C:\pax> type qq.txt
xyzzy,

解决它的一种方法是重新组织您的组件,以便数值不能与重定向相关联:

>>objects.txt ECHO OBJECTNUMBER%objectCounter%,%objectNumber%

我更喜欢把它们放在开头,因为使用了类似的东西:

echo xyzzy >file

实际上会输出xyzzy 紧接>之前的空格。

修改这样的行(并修复第三个echo,使其再次输出类别而不是数字)给你:

What is the name of the object 1?: Apple
How many of object 1 are there?: 1
Which group does object 1 belong to?: Fruit

生成的文件为:

OBJECTNAME1,Apple
OBJECTNUMBER1,1
OBJECTCATEGORY1,Fruit

【讨论】:

    【解决方案2】:

    这是一个简化:echo 命令将文本 data 1 发送到文件:

     echo data 1>somewhere.txt
    

    这里很容易看出1 将被解析器处理为要重定向的流号,而不是要发送到文件的数据。

    但问题不是使用空格,而是逗号。为什么会有同样的行为?因为从解析器的角度来看,空格、制表符、逗号、分号、括号和等号都是分隔符。所有这些行都以相同的方式失败(省略了标签)

    echo data 1>>somewhere.txt
    echo data,1>>somewhere.txt
    echo data;1>>somewhere.txt
    echo data=1>>somewhere.txt
    echo data(1>>somewhere.txt
    echo data)1>>somewhere.txt
    

    如何处理?需要将数字和重定向分开,所以我们可以改变行中的顺序

    >somewhere.txt echo data,1
    

    或强制解析器查看分隔符

    (echo data,1)>somewhere.txt
    

    或者,如果数据在变量中,我们也可以使用延迟扩展

    set "n=1"
    setlocal enabledelayedexpansion
    echo data,!n!>somewhere.txt
    

    当然,我们也可以这样做

    echo data,1 >>somewhere.txt
    

    在数据和重定向之间包含一个空格,但是这个空格会包含在重定向的数据中。

    另一种选择是重新组织代码

    @ECHO OFF
    
    SET objectCounter=1
    
    SET /p "objectName=What is the name of the object %objectCounter%?: "
    SET /p "objectNumber=How many of object %objectCounter% are there?: "
    SET /p "objectCategory=Which group does object %objectCounter% belong to?: "
    
    > objects.txt (
        ECHO OBJECTNAME%objectCounter%,%objectName%
        ECHO OBJECTNUMBER%objectCounter%,%objectNumber%
        ECHO OBJECTCATEGORY%objectCounter%,%objectCategory%
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 2022-11-28
      • 1970-01-01
      • 2017-11-29
      • 2013-05-25
      • 2020-03-30
      • 1970-01-01
      • 2017-12-11
      相关资源
      最近更新 更多