2

我有一个 SQL 过程,它调用命令 shell 将 SQL 转储写入文件。以这个编辑过的文件为例:

VALUES(
  @SomeVar
  ,1
)

该过程调用:

echo VALUES(>> C:\somefile.sql
echo @SomeVar>> C:\somefile.sql
echo ,1>> C:\somefile.sql
echo )>> C:\somefile.sql

这工作正常,除了,1线。如果你echo ,1>> C:\somefile.sql在 CMD 中运行,你会看到 C:\somefile.sql 只包含,

我的理论是echo 认为它可以接受超过 1 个参数。

如果将命令修改为echo ,1blah>> C:\somefile.sql,它可以完美运行。

我可以修改我的程序以检查该行是否包含 a,后跟一个数字,而不是任何内容,并^在数字前添加以对其进行转义。不过,这有点痛苦。

另外,echo 1>> C:\somefile.sqlEcho is ON

有没有办法echo在 CMD 中使用文字字符串?将字符串包含在" "输出"标记中。或者有没有其他你能想到的解决方案?

4

4 回答 4

2

问题是批处理文件 / 中标准输出流1的文件描述符。您可以改用此行来解决此问题:CMD.EXE

echo ,1 1>> C:\somefile.sql

或者,但更脆弱,只是在1>>重定向之间放一个空格

echo ,1 >> C:\Somefile.sql

更新:如果您真的担心上述示例的尾随空格,您也可以使用

>> C:\Somefile.sql echo ,1

即你也可以把重定向放在命令前面。个人觉得看起来有点别扭,不过YMMV。

于 2012-09-04T11:04:25.760 回答
2

你有几条路线可以去这里:

  1. 将重定向放在行首:

    > file echo foo
    
  2. echo括号括起来:

    (echo foo) > file
    

在后一种情况下,您必须将右括号转义为^),在前一种情况下,您可能必须这样做,具体取决于周围代码的外观。

于 2012-09-05T07:40:15.650 回答
1

转义尾随数字。

echo ,^1> C:\Somefile.sql
于 2012-09-04T11:26:35.930 回答
0

您可以输出文字字符串。echo 的所有参数都被重定向。问题是您的字符串和重定向之间没有空格。1>并且1>>>(管道输出到文件,如果存在则替换)和>>(管道输出并附加到文件,如果不存在则创建它)的特殊版本。它们重定向标准输出(C++ 中的标准输出,C# 中的 Console.Out)。2>2>>重定向标准错误输出(C++ 中的 stderr,C# 中的 Console.Error)。

例如:

echo 111 > a.txt
echo 111 1> a.txt

是等价的。

于 2012-09-04T11:04:25.913 回答