1

我在 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,这就是我所追求的。

我没有任何运气找到答案,我发现的所有内容都指向使用 ^^ 来让 echo 返回 ^。我不能将此命令分成多行,我需要它是 csv 格式的单行。

非常感谢任何有关修复的建议,我只需要使用一周左右,不需要优雅的解决方案,只需一个有效的解决方案。- 我对 bat 脚本非常陌生(实际上是一般的编程),同时会不断尝试不同的想法。

4

2 回答 2

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 上),您可以更轻松地控制输出。

于 2013-07-24T06:48:14.360 回答
1

只有感叹号会为您带来问题。

如果至少有一个!在您的行中(并且启用了延迟扩展),那么将开始第二个插入符号转义阶段。
在此阶段不考虑引号,只考虑插入符号。

一个小测试

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

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

于 2013-07-24T08:10:20.670 回答