当长字符串时,Echo错过^字符

时间:2013-07-24 06:38:15

标签: windows batch-file cmd

我在Windows批处理脚本中有以下命令

echo =%%k-16,INDIRECT.EXT^("'C:\Users\...\Analysis\[ObsStreamflow.xlsx]Sheet1'^!A%%k"^),INDIRECT.EXT^("'C:\Users\...\Analysis\[sim%%j.xlsx]Sheet1'^!B!val!"^),^=C%%k/1000,^=D%%k-B%%k,^=ABS^(E%%k^),^=(E%%k^)^^2,=^(B%%k-B10^),=Sqrt^(B%%k^),=SQRT^(D%%k^),=^(J%%k - B13^)^^2   >>t%%j.csv

其中省略的文件路径长度为38个字符(我不认为我达到了行限制,但以防这是问题)。这是我的.bat文件中的一行,这里显示为多行,只是为了使事情更具可读性。

输出大多是正确的,除了我有^^ 2,它只是2(所以我有=(E1)2和=(J1-B13)2。如果我省略了Indirect.Ext文本,和只是

echo =%%k-16,a1,b1,^=C%%k/1000,^=D%%k-B%%k,^=ABS^(E%%k^),^=(E%%k^)^^2,=^(B%%k-B10^),=Sqrt^(B%%k^),=SQRT^(D%%k^),=^(J%%k - B13^)^^2   >>t%%j.csv

它打印正确,所以相关的评论显示为=(E1)^ 2和=(J1-B13)^ 2,这就是我所追求的。

我没有找到答案的运气,我发现的所有内容都指向使用^^来获得回复^。我不能将这个命令分成多行,我需要它是csv格式的单行。

对修复的任何建议都非常感激,我只需要使用它一个星期左右,不需要优雅的解决方案,只需一个有效的解决方案。 - 我对蝙蝠脚本非常陌生(实际上是一般的编程),会在同一时间继续尝试不同的想法。

2 个答案:

答案 0 :(得分:1)

不确定您的具体问题是什么,但您可以使用Windows中的技巧来模拟echo -n(没有换行符的回声)。

命令:

<nul:  >file.csv set /p junk=first field
<nul: >>file.csv set /p junk=,second field
      >>file.csv echo ,third field

将产生行:

first field,second field,third field

这可能会让您更容易避免特定问题,并且作为奖励,清理您的脚本以使其更具可读性(例如每个脚本行一个字段)。

它有效,因为set /p var=prompt是输入命令。它首先输出prompt而没有换行,然后等待用户输入内容,将其分配给var环境变量。

通过从nul:获取输入,您基本上会给它一个空字符串,因此它不会等待。提示输出到file.csv,没有换行符。

在任何情况下,对于某些这个复合体,我会绕过cmd.exe以获得更强大的功能,例如CygWin或MinGW下的UNIX文本处理工具(需要安装)但是非常值得),甚至是VBScript脚本(默认情况下应该在Windows上),您可以更轻松地控制输出。

答案 1 :(得分:0)

只有感叹号会为你造成问题。

如果您的行中至少有一个!(并且已启用延迟扩展),则将启动第二个插入符号转义阶段。
在这个阶段,引用不被视为,只有插入符号。

小测试

setlocal EnableDelayedExpansion
echo one^1
echo two^^2
echo two^^2 With exclam!
echo five^^^^^& With exclam!

输出

one1
two^2
two2 With exclam
four^& With exclam

因此,在您的样本中,您需要五个插入符号 四个用于创建一个插入符号,最后一个用于转义),因为特殊字符的转义只需要一次。