2010-03-19 2 views
3

Мне нужно извлечь и сохранить некоторые таблицы из удаленной базы данных SQL с помощью bcp. Я хотел бы написать сценарий powershell для вызова bcp для каждой таблицы и сохранения данных. Пока у меня есть этот скрипт, который создает необходимые аргументы для bcp. Однако я не могу понять, как передать аргументы в bcp. Каждый раз, когда я запускаю скрипт, он просто показывает помощь bcp. Это должно быть что-то действительно легкое, чего я не получаю.Запустите команду оболочки с аргументами из сценария powershell

#commands bcp database.dbo.tablename out c:\temp\users.txt -N -t, -U uname -P pwd -S <servername> 
$bcp_path = "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\bcp.exe" 
$serverinfo [email protected]{} 
$serverinfo.add('table','database.dbo.tablename') 
$serverinfo.add('uid','uname') 
$serverinfo.add('pwd','pwd') 
$serverinfo.add('server','servername') 
$out_path= "c:\Temp\db\" 
$args = "$($serverinfo['table']) out $($out_path)test.dat -N -t, -U $($serverinfo['uid']) -P $($serverinfo['pwd']) -S $($serverinfo['server'])" 

#this is the part I can't figure out 
& $bcp_path $args 

ответ

5

Прежде всего, $args - автоматическая переменная; вы не можете установить его, поэтому любая строка, например, $args = foo, ничего не сделает (даже со строгим режимом, хотя жалоба была бы приятной).

Затем вы передаете только один аргумент (строка) в программу. Я содержит пробелы, но они правильно экранированы или заключены в круглые скобки, поэтому программа видит только один аргумент.

Вам нужно будет использовать массив для аргументов для программы, а не одну строку, если вы хотите сохранить ее в переменной заранее. И вы должны назвать это нечто иное, чем $args:

$arguments = "$($serverinfo['table'])", 
      'out',"$($out_path)test.dat", 
      '-N','-t,', 
      '-U',"$($serverinfo['uid'])", 
      '-P',"$($serverinfo['pwd'])", 
      '-S',"$($serverinfo['server'])" 

& $bcp_path $arguments 

Или, что я предпочел бы, на самом деле, вы можете просто написать его в одной строке, которая избавляется от большинства безобразия здесь:

$out_path = 'c:\Temp\db' 
& $bcp_path $serverinfo['table'] out $out_path\test.dat -N '-t,' -U $serverinfo['uid'] -P $serverinfo['pwd'] -S $serverinfo['server'] 
1

Некоторые приложения из командной строки, которые должны принимать сумасшедшие аргументы в стиле Каннам, с косыми чертами, цитатами, двойными кавычками, равными, двоеточиями, тире, настоящим коктейлем.

PowerShell, по моему опыту, иногда просто не может справиться. Так что я выписывать в CMD-файл и выполнить что из cmd.exe, например, так:

echo $("Running command: " + $commandLine); 

$rnd = $(([string](Get-Random -Minimum 10000 -Maximum 99999999)) + ".cmd"); 
$commandFilePath = $(Join-Path -Path $env:TEMP -ChildPath $rnd); 
echo $commandLine | Out-File -FilePath $commandFilePath -Encoding ascii; 

& cmd.exe /c $commandFilePath 

Убедитесь, что вы вывод как ASCII, так как по умолчанию Unicode не может играть хорошо с cmd.exe (он рявкнул на меня и я показал нечетные символы при первой попытке).

+0

см. Мой [вопрос здесь] (http://stackoverflow.com/q/21524101/107537). Пожалуйста, помоги, если можешь. – Vijay

+0

Стоит проверить вопрос Виджая, потому что у него есть ответ, который лучше других, если вы на PS V3. –

Смежные вопросы