私は foo.sql を次のように持っています:
print 'foo=$(foo)'
次に、foo.cmd に次のシェル スクリプトがあります。
sqlcmd -i foo.sql -v foo="c:\path"
foo.cmd を実行すると、次のように出力されます。
foo=\path
「c:」をエスケープするにはどうすればよいですか? dos-shell がそれを食べていますか、それとも sqlcmd ですか?
cmd の引数区切り文字には等号が含まれます。他のケース (bjam.exe など) では、適切に機能するためにパラメーター シーケンス全体を引用符で囲む必要があることがわかりました。
これを試して:
sqlcmd -i foo.sql -v "foo=c:\path"
それでも「c:」部分が削除される場合は、sqlcmd に焦点を当てます。私は個人的にテストするためにインストールしていません。これは、同様の状況での経験のみに基づいています。
別のシェルを使用すると、これが発生します。
PowerShell経由でsqlcmdを実行したときにこれがありました。cmd.exe の使用に切り替え、正常に動作しました
":" をエスケープする二重引用符と単一引用符を使用して、SQL が変数値を文字列として扱うようにします。例えば
sqlcmd -S . -d myDb -i .\test.sql -v pathToFile = "'D:\Temp\temp\My.csv'"
OK、私の間違いです。上記は機能します。
私が間違っていたこと: sqlcmd -i foo.sql -v foo='c:\path'
(単一引用符、' ' SQL 文字列として渡そうとしたため) は機能しません。それはcを切り刻みます:
バックスラッシュをエスケープし、
sqlcmd -i foo.sql -v foo="c:\\path"
それは実際にあなたの殻が\を食べている