Невозможно запустить команду bcp из PowerShell - PullRequest
0 голосов
/ 15 октября 2019

Мне нужно вызвать bcp.exe из скрипта PowerShell. Мой код:

$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

Это дает мне ошибку

usage: : The term 'usage:' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
At line:1 char:1
+ usage: C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe { ...
+ ~~~~~~
    + CategoryInfo          : ObjectNotFound: (usage::String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Если яудалить & из строки, я получаю исключение

C:\Program : The term 'C:\Program' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or
if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ C:\Program Files\Microsoft SQL Server\110\Tools\Binn\bcp.exe MyDb.dbo ...
+ ~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\Program:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Как мне позвонить bcp из PowerShell?

Ответы [ 3 ]

3 голосов
/ 15 октября 2019

Причина, по которой ваш код работает не так, как вы ожидаете (за исключением того факта, что вы не должны использовать 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
0 голосов
/ 15 октября 2019

Другой способ сделать это с оператором вызова, как здесь, с массивом для аргументов, который как-то работает правильно: 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
0 голосов
/ 15 октября 2019

Попробуйте следующее:

$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
...