2012-03-21 72 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