我有一个让我疯狂的功能的以下部分。如您所见,我正在生成一个路径和文件名来批量复制表数据。当我在PowerShell脚本中运行它时,我收到以下错误:
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
但是,当我从Write-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 :(得分:0)
我不知道如何将字符串扩展为各种属性。
然而,你可以直接传递它们。
.\bcp.exe $db.$table out "$fullFilePath" -E -N -Sserver1\instance -Uxyz -Pxyz > Output.txt
答案 1 :(得分:0)
这与在Powershell中执行遗留命令有关,有时调用操作符(&)会起作用,有时候如果有很多参数,就像bcp.exe一样。执行遗留应用程序的另一种方法是使用start-process。我已经重新编写了代码并成功测试了以下内容。
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
"@
}
}
答案 2 :(得分: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