передача пути к SqlCmd в сценарии powershell - PullRequest
11 голосов
/ 17 сентября 2010

Я пытаюсь написать скрипт powershell, который будет запускать sqlcmd.exe для запуска сценария sql. Скрипт содержит переменную SQLCMD, которую я хочу передать в командной строке с помощью ключа -v sqlcmd. Проблема в том, что powershell делает что-то странное, когда я передаю путь в качестве значения одной из моих переменных, что в свою очередь приводит к сбою сценария SQL.

Например, я звоню:

$path = 'C:\path'
sqlcmd -SMySQLServerInstance  -i 'MySqlScript.sql'  -v MyVariablePath=$path

при запуске я получаю сообщение об ошибке:

Sqlcmd: ':\path': Invalid argument.

Никаких двойных или одинарных кавычек, которые я пробовал около $path или MyVariablePath=$path решает проблему.

Может ли кто-нибудь привести простой канонический пример того, как это нужно сделать?

Ответы [ 4 ]

19 голосов
/ 21 сентября 2010

наконец-то сработало. для следующего присоски, чтобы попробовать это вот решение

Сценарий powershell выглядит как

$myPath = "`"C:\Path`"" 
sqlcmd.exe -SmySQLInstance -i./test.sql -v myvar=$myPath

В моем файле test.sql может использоваться переменная, подобная этой

PRINT "$(myvar)"

ключом здесь является понимание того, как powershell экранирует символы. Подробнее об этом здесь

2 голосов
/ 30 июня 2014

Имел ту же проблему, случайно нашел решение, все еще не понимаю, почему оно работает :) (хотя я не профессионал powershell):

sqlcmd -d ... -s ... -v Var1Name=("""$PowershellVar1""") Var2Name=("""$PowershellVar2""")

Переменные $PowershellVar1 и $PowershellVar2 имеют строковый тип в моем скрипте PS и могут содержать кавычки, пробелы и т. Д.

1 голос
/ 19 октября 2016

Я недавно играл с этой проблемой.В моем случае у меня были переменные с точками и пробелами внутри.Я перечислю все комбинации, которые я пытался запустить.

Тестовый файл SQL test.sql

declare @testvar varchar(30);
set @testvar = '$(testvar)';
print @testvar;

Набор моих тестовых переменных:

$varA = 'Abc1.3,Abc4.3'                        # contains only dots
$varB = 'A bc1.3,Ab c4.3'                      # contains dots and spaces
$varC = 'xx   x.yy,y,.1.2.,3 ,  y'             # contains dots and multiple spaces

Тестирование sqlcmd команда

sqlcmd -v testvar=`"$var`" -i test.sql
sqlcmd -v testvar=($var) -i test.sql
sqlcmd -v testvar=("""$var""") -i test.sql     # Solution by Andrei Shakh

a) Тест # 1

Сначала я обнаружил, что мой скрипт powershell возвращает ошибку для переменной, содержащей пробелы

sqlcmd -v testvar=`"$varA`" -i test.sql
Abc1.3,Abc4.3

sqlcmd -v testvar=`"$varB`" -i test.sql
sqlcmd : Sqlcmd: 'testvar="A bc1.3,Ab c4.3""': Invalid argument. Enter '-?' for help. At line:2 char:1

b) Тест № 2

Наконец-то найдено решение заменить переменную скобками вместо двойных кавычек, НО!

sqlcmd -v testvar=($varA) -i test.sql
sqlcmd : Sqlcmd: ',Abc4.3': Invalid argument. Enter '-?' for help. At line:1 char:1

sqlcmd -v testvar=($varB) -i test.sql
A bc1.3,Ab c4.3

Интересно, что я обнаружил, что это решениене работает с точками в моих переменных.

c) Тест # 3

Я создал скрипт для сопоставления пробела в переменной и в этом случае использовал круглые скобки, которые работают в обоих направлениях.

If ($var -match " ")                           # or ($var -like "* *")
{
    sqlcmd  -v testvar=($var) -i test.sql
}
Else
{
    sqlcmd  -v testvar=`"$var`" -i test.sql
}

d) Окончательное решение

На сегодняшний день лучшим решением, которое я нашел, был ответ Андрей Шах , который работает со всем без использования государственных деятелей IF / ELSE дляпроверьте, есть ли место в строке или нет.

sqlcmd -v testvar=("""$varA""") -i test.sql
Abc1.3,Abc4.3

sqlcmd -v testvar=("""$varB""") -i test.sql
A bc1.3,Ab c4.3

sqlcmd -v testvar=("""$varC""") -i test.sql
xx   x.yy,y,.1.2.,3 ,  y
1 голос
/ 17 сентября 2010

Несколько вариантов этой проблемы вы найдете на вкладке Обходные пути на , эта проблема подана на сайте Microsoft Connect . Пока вы там, пожалуйста, проголосуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...