PowerShellにネイティブsqlcmdコマンドを含む文字列があります。コマンド自体は、cmd.exeで正常に実行できます。私はPowerShellでそれらを実行するのが困難です。誰でも助けることができますか?ありがとう。
これはsql.sqlです
select @@servername
go
select @@servicename
これは、cmd.exeからsqlcmdコマンドを実行した結果です
C:\Users\test>sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
--------------------------------------------------
thesimpsons\INSTANCE1
(1 rows affected)
--------------------------------------------------
INSTANCE1
(1 rows affected)
C:\Users\test>
これは、sqlcmdコマンドを呼び出すためのPowerShellスクリプトです。
$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command $sql
このPowerShellスクリプトを実行すると、次のエラーが発生しました。
PS C:\TEMP> $sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command $sql
Invoke-Command : Parameter set cannot be resolved using the specified named parame
ters.
At line:5 char:15
+ Invoke-Command <<<< $sql
+ CategoryInfo : InvalidArgument: (:) [Invoke-Command], ParameterBin
dingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands
.InvokeCommandCommand
Win32実行可能ファイルを呼び出すには、次のように呼び出し演算子&
を使用します。
& sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
外部の 'SQLCMD.EXE'の使用を停止し、代わりに Invoke-Sqlcmdコマンドレット を使用することもできます。
Invoke-Sqlcmdは、言語(Transact-SQLおよびXQuery)からのステートメントと、sqlcmdユーティリティでサポートされているコマンドを含むスクリプトを実行するSQL Serverコマンドレットです。
「sqlps」ユーティリティを開いて実行するだけです
Invoke-Sqlcmd -InputFile "C:\temp\sql.sql"
SQL Server PowerShellの実行 を参照してください
「Invoke-Sqlcmd」を使用する前に、PowerShellでSQL Serverスナップインを手動で読み込むこともできます。
MS SQL Server 2012の場合は、次のコマンドを実行して実行できますImport-Module SqlPs
これは、スクリプトで外部コマンドを作成する方法です
$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
-U a `
-P a `
-i `"c:\temp\sql.sql`" }
Invoke-Command -ScriptBlock $scriptBlock
その後、その中で$ args変数を使用し、リモートで起動することもできます。
$scriptblock = {fullpath\sqlcmd -S `"(local)\instance1`" <# comment option -S #>`
-U a `
-P a `
-i `"$($args[0])`" }
Invoke-Command -ScriptBlock $scriptBlock -argumentList "c:\temp\sql.sql" -computer "remote1"
備考:
これにより、各パラメーターをコメント化できます。
行末にある「 `」を忘れずにスペースを忘れないように注意してください。
使用する Invoke-Expression
のではなく Invoke-Command
Invoke-commandの最初の定位置パラメーターは-scriptblockであり、スクリプトブロック引数が必要です。 here-stringを利用してコマンドを作成し、invoke-commandで実行するには、here-stringをスクリプトブロックに変換する必要があります。
$sql = @"
sqlcmd -S "(local)\instance1" -U a -P a -i "c:\temp\sql.sql"
"@
Invoke-Command ([scriptblock]::create($sql))
これは、&演算子を使用してpowershellスクリプト内からsqlcmdを使用するために私にとってうまくいったものです、csvファイルを生成するサンプルを参照してください:
&cmd/c "sqlcmd -S $ sv -i $ PROCFILE -s、-v varDB = $ dbclean -o $ filename"
$sv
には、SERVERNAME\INSTANCE
$PROCFILE
のようなものです d:\TSTSQL\Sqlquery.SQL
$filename
はd:\TSTSQL\Desiredoutfilename.CSV
$dbclean
は、sqlファイルに渡されるパラメーターです
インスタンス名とユーザー名の両方が完全に修飾されている必要があります
<domain_name>\Instanc_name
および<domai_name>\Username
。インスタンス名のみが正しくスクリプト化されます。