2

コマンド シェルを呼び出して SQL ダンプをファイルに書き込む 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.sql書き込みますEcho is ON

echoCMD でリテラル文字列を取得する方法はありますか? 文字列をで囲むとマークが" "出力されます。"または、他に考えられる解決策はありますか?

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++ では stdout、C# では Console.Out) をリダイレクトします。標準エラー出力 (C++ では stderr、C# では Console.Error)をリダイレクトします。>>>2>2>>

例えば:

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

同等です。

于 2012-09-04T11:04:25.913 に答える