批处理脚本 - 将数值写入txt文件时导致问题的逗号

时间:2015-09-01 08:43:50

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

所以这是我正在编写的一个脚本示例,用于生成txt文件,其中包含一系列正确格式化的命令,这些命令将根据一系列问题传递给另一个系统。

如果为RedirectMatch 301 ^/$ http://testsite.com/en/ objectNameobjectNumber分配了字母数字值,则脚本将正确写入txt文件。但是,如果我要分配一个数值,则该值不会写入txt文件。

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

objectCategory

如果@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,则这是输出到txt文件的示例:

1

如果为OBJECTNAME1,Apple OBJECTNUMBER1, OBJECTCATEGORY1,Fruit 分配的值为objectNumber或更多,则这是输出到txt文件的示例:

2

2 个答案:

答案 0 :(得分: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%
)

答案 1 :(得分:1)

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

换句话说,while:

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