2012-03-21 166 views
2

我有下面這個讓我發瘋的函數部分。如您所見,我正在生成一個路徑和文件名以將表數據批量複製到。當我運行這個PowerShell腳本我碰到下面的錯誤中: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 

然而,當我複製輸出字符串我從寫-host命令獲取並粘貼到命令提示符下我可以執行它只是罰款。是什麼賦予了?輸出

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"會將您的參數括在雙引號中。

爲了簡化,我會把$ BCP裏面的字符串,那麼就使用Invoke-Expression

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

'「'原因的變量加以擴展'''不,我不相信任何通過。執行功能(它們被操作系統剝離) – Guvante 2012-10-01 20:10:00