无法从 PowerShell 运行 bcp 命令

Posted

技术标签:

【中文标题】无法从 PowerShell 运行 bcp 命令【英文标题】:Unable to run bcp command from PowerShell 【发布时间】:2020-02-12 02:06:15 【问题描述】:

我必须从 PowerShell 脚本调用 bcp.exe。我的代码是:

$dataBase = 'MyDb'
$ProdEinheitTable = 'dbo.ProdEinheit'
$ProzessdatenTable = 'dbo.Prozessdaten_aktuell'
$sqlServerUserName = 'sa'
$sqlServerPassword = 'Password'
$server = 'MSSQLLocalDB'

$bcp = & 'C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe'

我这样调用bcp 实用程序:

$bcp_args = "$bcp $dataBase.$ProdEinheitTable IN $datFileName -f $fmtFileName -U $sqlServerUserName -P sqlServerPassword -S $server -n"
Invoke-Expression $bcp_args

它给了我错误

用法::术语“用法:”不被识别为 cmdlet、函数的名称, 脚本文件或可运行的程序。检查名称的拼写,或者如果路径 已包含,请验证路径是否正确,然后重试。 在行:1 字符:1 + 用法:C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe ... +~~~~~~ + CategoryInfo : ObjectNotFound: (usage::String) [], CommandNotFoundException +fullyQualifiedErrorId:CommandNotFoundException

如果我从字符串中删除 & 我会得到异常

C:\Program :术语“C:\Program”未被识别为 cmdlet 的名称, 函数、脚本文件或可运行的程序。检查名称的拼写,或 如果包含路径,请验证路径是否正确并重试。 在行:1 字符:1 + C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe MyDb.dbo ... + ~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (C:\Program:String) [], CommandNotFoundException +fullyQualifiedErrorId:CommandNotFoundException

如何从 PowerShell 调用 bcp

【问题讨论】:

我会尝试使用Start-Process 和-ArgumentList 参数。 Do not use Invoke-Expression. 【参考方案1】:

您的代码无法按您期望的方式运行的原因(除了您首先shouldn't be using Invoke-Expression)是因为您的期望似乎是这样的

$bcp = & 'C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe'

将定义某种命令调用别名。事实并非如此。该语句不带参数直接调用bcp.exe,并将命令的输出存储在变量$bcp中(常规输出,而不是错误输出)。

这应该可行:

$dataBase = 'MyDb'
$ProdEinheitTable = 'dbo.ProdEinheit'
$ProzessdatenTable = 'dbo.Prozessdaten_aktuell'
$sqlServerUserName = 'sa'
$sqlServerPassword = 'Password'
$server = 'MSSQLLocalDB'

$bcp = 'C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe'

$bcp_args = "$dataBase.$ProdEinheitTable", 'IN', $datFileName,
            '-f', $fmtFileName, '-U', $sqlServerUserName,
            '-P', $sqlServerPassword, '-S', $server, '-n'

& $bcp @bcp_args

【讨论】:

【参考方案2】:

尝试以下操作:

$bcp = 'C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe'
$bcp_args = "$dataBase.$ProdEinheitTable IN $datFileName -f $fmtFileName -U $sqlServerUserName -P sqlServerPassword -S $server -n"

Start-Process -FilePath $bcp -ArgumentList $bcp_args

【讨论】:

【参考方案3】:

另一种使用调用运算符的方法,例如此处使用以某种方式正常工作的 args 数组:https://com2kid.wordpress.com/2011/09/25/powershell-call-operator-using-an-array-of-parameters-to-solve-all-your-quoting-problems/

$bcp = 'C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe'
$bcp_args = echo $bcp $dataBase.$ProdEinheitTable IN $datFileName -f $fmtFileName -U $sqlServerUserName -P sqlServerPassword -S $server -n
& $bcp $bcp_args

【讨论】:

以上是关于无法从 PowerShell 运行 bcp 命令的主要内容,如果未能解决你的问题,请参考以下文章

bcp 未从任务调度程序运行

C:\Windows\System32\bcp47mrm.dll没有被指定在Windows上运行,或者它包含错误。 这个怎么解决?

运行 powershell 命令以在 c# 上按进程获取 GPU 使用情况

'bcp' 不是内部或外部命令,也不是可运行的程序?

CMD执行BCP命令

无法在 Microsoft Powershell 中使用“mvn -D”参数运行 Maven,但可以在命令提示符下运行