2016-04-27 41 views
1

、Windowsのバッチファイルでは、この作品:エラーが発生した変数を使用してバッチファイルでsqlcmd.exeを呼び出す: "予期しない引数"

sqlcmd.exe -b -S xxMySqlServerNamexx -Q "BACKUP DATABASE xxMyDatabaseNamexx TO DISK='d:\data\xxMyDatabaseNamexx.bak' with init, compression" 

この場合と同様に:

set vSource_SqlServer="xxMySqlServerNamexx"  
sqlcmd.exe -b -S %vSource_SqlServer% -Q "BACKUP DATABASE xxMyDatabaseNamexx TO DISK='d:\data\xxMyDatabaseNamexx.bak' with init, compression" 

しかし、この:

set vSource_SqlServer="xxMySqlServerNamexx" 
set vSource_SqlDbName="xxMyDatabaseNamexx" 
sqlcmd.exe -b -S %vSource_SqlServer% -Q "BACKUP DATABASE %vSource_SqlDbName% TO DISK='d:\data\xxMyDatabaseNamexx.bak' with init, compression" 

は...エラーが発生します。

Sqlcmd: 'xxMyDatabaseNamexx" TO DISK='d:\data\xxMyDatabaseNamexx.bak' with init, compression"': Unexpected argument. Enter '-?' for help. 

あなたはそれがxxMyDatabaseNamexx

の代わりに変数%vSource_SqlDbName%を使用してのどに詰まらされて見ることができるように、この形式でこのを行うための正しい方法はあります私はおそらくPowerShellを使用する必要があります(その分私が意味する、はい私はこのフォームにいくつかの既存のバッチファイルを用意していますが、このフォームで使用する変数に変換する方が良いでしょう。

答えて

2

setステートメントは引数を省略しません。 したがって、set a=b cは%a%がb cに拡大され、set a="b c""b c"に拡大することを意味します。

したがって、動作していない例では、二重引用符で囲まれた文字列を二重引用符で囲んだ文字列の中に入れていますが、これは機能しません。

setから引用符を削除しても問題はありません。変数を設定するための

0

最も安全な方法は、構文を使用することです(場合command extensionsには、とにかく、Windowsのデフォルト設定である、有効になっている):

set "vSource_SqlDbName=xxMyDatabaseNamexx" 

注式全体の周りの引用符は、拡張された値の一部にはなりません。したがって%vSource_SqlDbName%vSource_SqlDbNameに拡張されます。

関連する問題