PowerShell脚本未正确执行bcp命令

PowerShell脚本未正确执行bcp命令,powershell,bcp,Powershell,Bcp,我有一个函数的以下部分让我发疯。如您所见,我正在生成一个路径和文件名,以便将表数据大容量复制到其中。在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命令获得

我有一个函数的以下部分让我发疯。如您所见,我正在生成一个路径和文件名,以便将表数据大容量复制到其中。在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

我不知道如何将字符串扩展为各种属性

不过,你可以直接把它们传进来

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

我不知道如何将字符串扩展为各种属性

不过,你可以直接把它们传进来

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

这与在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
"@
        }

}

这与在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
"@
        }

}

我想这是因为引用了这些话

bcp$copyexecstring将用双引号括起您的参数

为了简化,我将$bcp放在字符串中,然后只使用Invoke表达式:


我想这是因为引用了这些话

bcp$copyexecstring将用双引号括起您的参数

为了简化,我将$bcp放在字符串中,然后只使用Invoke表达式:

使变量展开。'不要。我不相信这两种方法都会传递给执行函数,因为操作系统会剥离它们,从而导致变量被扩展。”不要。我不相信这两个函数都会传递给执行函数,它们都会被操作系统剥离