【问题标题】:Echo literal string?回显文字字符串?
【发布时间】:2012-09-04 10:56:24
【问题描述】:

我有一个 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 行。如果你在CMD中运行echo ,1>> C:\somefile.sql,你会看到C:\somefile.sql只包含,

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

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

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

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

有没有办法在 CMD 中 echo 一个文字字符串?将字符串括在" " 中会输出" 标记。或者你有什么其他的解决办法吗?

【问题讨论】:

    标签: windows command-line cmd command-prompt xp-cmdshell


    【解决方案1】:

    问题在于1 是批处理文件/CMD.EXEstandard output stream 的文件描述符。您可以改用此行来解决此问题:

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

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

    echo ,1 >> C:\Somefile.sql
    

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

    >> C:\Somefile.sql echo ,1
    

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

    【讨论】:

    • 但这不是关于有效 SQL/UPDATE 语句语法的问题,不是吗?
    【解决方案2】:

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

    1. 将重定向放在行首:

      > file echo foo
      
    2. echo 放在括号中:

      (echo foo) > file
      

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

    【讨论】:

      【解决方案3】:

      转义尾随数字。

      echo ,^1> C:\Somefile.sql
      

      【讨论】:

      • 改写我的回答:这是您问题的唯一解决方案。
      • +1,我不知道您可以转义 1 以避免将其视为文件描述符。很酷。但这不是唯一的解决方案。您还可以通过将重定向放在前面来获得不带尾随空格的正确输出:>c:\somefile.sql echo ,1
      【解决方案4】:

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

      例如:

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

      是等价的。

      【讨论】:

      • 这个问题是它把111[space]写入文件
      • 您使用 echo 有什么特殊原因吗?您可以只执行copy con somefilel.sql 然后输入您的 SQL 并以 control-Z 字符/F6(文件结尾)结束它。不过,后一部分可能会更难。
      • 这太完美了!无需任何逃避!!我很确定我可以通过 CHAR(26) 获得 EOF。非常感谢@akton - 我会在查看 EOF 后立即将其标记为已接受的答案。
      • 不幸的是,在将我的程序中的所有echos 转换为INSERT INTO #Temps 并尝试copy con 之后,我终生无法找到镜像 CR 的方法/LF 或 EOF。我为 CR/LF 和 4、26 尝试了 ASCII 代码 10、13 和 10 和 13,对于 EOF/EOT 可能还有更多……没有任何效果! :(
      • @DannyBeckett 您能否修改您的问题以包含我们的 xp_cmdshell 脚本的内容?
      猜你喜欢
      • 2011-04-12
      • 2015-01-05
      • 1970-01-01
      • 2015-07-02
      • 2014-07-14
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多