2012-03-21 29 views
2

私は夢中になっている次の機能を持っています。ご覧のとおり、テーブルデータを一括コピーするパスとファイル名を生成しています。私は次のエラーを取得するPowerShellスクリプトの中にこれを実行すると:私は、出力文字列をコピーする場合しかし、私は書き込み-hostコマンドから取得し、コマンドプロンプトに貼り付けPowerShellスクリプトが正しくbcpコマンドを実行していません

C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe: unknown option 1 
usage: C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe 

私はうまくそれを実行することができます。何がありますか?出力の

ForEach($table in $db.Tables | where {$_.IsSystemObject -eq $false}) 
{ 

     $fullName = "$db.$table" 

     If($scriptTables -contains $fullName) 
     { 
       $fullFilePath = (pwd).path + "\$db.$table" + ".dat" 
       $copyExecString = "$db.$table out `"$fullFilePath`" -E -N -Sserver1\instance -Uxyz -Pxyz > Output.txt" 
       & bcp "$copyExecString" #Invoke-Expression "bcp $copyExecString" 
       Write-host "bcp $copyExecString"      
     } 

} 

例:

bcp [DB].[dbo].[Table] out "C:\Development\ScriptDemoData\[DB].[dbo].[Table].dat" -E -N -Sserver1\instance -Uxyz -Pxyz > Output.txt 

答えて

0

私はさまざまなプロパティに文字列を展開する方法がわかりません。

ただし、それらを直接渡すことはできます。

.\bcp.exe $db.$table out "$fullFilePath" -E -N -Sserver1\instance -Uxyz -Pxyz > Output.txt 
0

これは、従来の実行に関係していますがPowerShellのコマンドbcp.exeのと同様に、時々呼び出し演算子(&)が動作し、時にはそれが多くの引数特にあり場合はしません。レガシーアプリケーションを実行する別の方法は、開始プロセスを使用することです。私はあなたのコードを修正し、以下をうまくテストしました。

try {add-type -AssemblyName "Microsoft.SqlServer.ConnectionInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" -EA Stop} 
catch {add-type -AssemblyName "Microsoft.SqlServer.ConnectionInfo"} 

try {add-type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" -EA Stop; $smoVersion = 10} 
catch {add-type -AssemblyName "Microsoft.SqlServer.Smo"; $smoVersion = 9} 

$ServerInstance = "$env:computername\sql1" 
$Database = 'AdventureWorks' 
$server = new-object ("Microsoft.SqlServer.Management.Smo.Server") $ServerInstance 
$db = $server.Databases[$Database] 
$scriptTables = ,'[AdventureWorks].[Sales].[StoreContact]' 

ForEach($table in $db.Tables | where {$_.IsSystemObject -eq $false}) 
{ 

     $fullName = "$db.$table" 

     If($scriptTables -contains $fullName) 
     { 
       $fullFilePath = (pwd).path + "\$db.$table" + ".dat" 
       start-process -NoNewWindow -RedirectStandardOutput output.txt -FilePath bcp -ArgumentList @" 
$db.$table out "$fullFilePath" -E -N -S$ServerInstance -T 
"@ 
     } 

} 
0

これは引用のためだと私は思う。

bcp "$copyexecstring"は、パラメータを二重引用符で囲みます。簡単にするために

、私はその後、ちょうどInvoke-Expressionを使用し、文字列内の$ bcpを置く:。

$copyExecString = "$db.$table out `"$fullFilePath`" -E -N -Sserver1\instance -Uxyz -Pxyz > Output.txt" 
$copyexecstring = "bcp $copyexecstring" 
$return = (Invoke-expression $copyexecstring) | Out-string 
+0

'" '変数を展開させることが' ' '私はどちらかが渡されたとは考えていないません。実行中の機能(OSによって削除されている) – Guvante

関連する問題