我正在尝试编写一个powershell脚本,它将执行sqlcmd.exe来运行sql脚本。该脚本包含一个SQLCMD变量,我想通过sqlcmd的-v开关在命令行中传入该变量。问题是当我传递路径作为我的一个变量的值时,powershell做了一些奇怪的事情,这反过来导致SQL脚本失败。
例如我正在打电话:
$path = 'C:\path'
sqlcmd -SMySQLServerInstance -i 'MySqlScript.sql' -v MyVariablePath=$path
运行时收到错误消息:
Sqlcmd: ':\path': Invalid argument.
我在$path
或MyVariablePath=$path
周围尝试过双重或单引号的数量
解决了这个问题。
有人可以提供一个简单的规范示例,说明如何做到这一点吗?
答案 0 :(得分:19)
终于解决了。对于下一个尝试这个的吸盘是解决方案
powershell脚本看起来像
$myPath = "`"C:\Path`""
sqlcmd.exe -SmySQLInstance -i./test.sql -v myvar=$myPath
我的test.sql文件可以使用像这样的变量
PRINT "$(myvar)"
这里的关键是理解powershell如何逃避角色。关于here
的更多信息答案 1 :(得分:2)
如果出现同样的问题,偶然发现了解决方案,仍然不明白它的工作原理:)(虽然我不是PowerShell专业人士):
sqlcmd -d ... -s ... -v Var1Name=("""$PowershellVar1""") Var2Name=("""$PowershellVar2""")
变量$PowershellVar1
和$PowershellVar2
在我的PS脚本中有字符串类型,可以包含引号,空格等
答案 2 :(得分:1)
您可以在this issue filed on the Microsoft connect site的“变通办法”标签上找到此问题的几个选项。当你在那里时请投票。
答案 3 :(得分:1)
我最近在玩这个问题。就我而言,我的变量中包含点和空格。我将列出我试图让它运行的所有组合。
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 -v testvar=`"$var`" -i test.sql
sqlcmd -v testvar=($var) -i test.sql
sqlcmd -v testvar=("""$var""") -i test.sql # Solution by Andrei Shakh
首先我发现我的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
最后找到了用括号而不是双引号替换变量的解决方案,但是!
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
有趣的是,我发现这个解决方案不适用于变量中的点。
我制作了一个脚本来匹配变量中的空格,在这种情况下使用括号,它可以双向运行。
If ($var -match " ") # or ($var -like "* *")
{
sqlcmd -v testvar=($var) -i test.sql
}
Else
{
sqlcmd -v testvar=`"$var`" -i test.sql
}
到目前为止,我发现最好的解决方案是Andrei Shakh这里的答案,它可以在不使用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