【问题标题】:passing path to SqlCmd within powershell script在 powershell 脚本中将路径传递给 SqlCmd
【发布时间】:2010-09-17 10:28:10
【问题描述】:

我正在尝试编写一个 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 周围没有尝试过多少双引号或单引号 解决问题。

有人可以提供一个简单的规范示例来说明这需要如何完成吗?

【问题讨论】:

  • 我遇到了同样的问题,但我无法在互联网上的任何地方找到解决方案。我当前的 powershell 版本是 5.1。

标签: powershell sqlcmd


【解决方案1】:

终于解决了。让下一个傻瓜尝试这里是解决方案

powershell 脚本看起来像

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

我的 test.sql 文件可以像这样使用变量

PRINT "$(myvar)"

这里的关键是了解 powershell 如何转义字符。更多信息here

【讨论】:

  • 引号是否应该像那样不匹配?
  • 这个解决方案对我不起作用。我使用的是 5.1 版本的 powershell。
【解决方案2】:

遇到了同样的问题,偶然发现了解决方案,仍然不明白它为什么起作用:)(虽然我不是powershell pro):

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

变量$PowershellVar1 和$PowershellVar2 在我的PS 脚本中有字符串类型,可以包含引号、空格等

【讨论】:

    【解决方案3】:

    您将在this issue filed on the Microsoft connect site 的“解决方法”选项卡上找到解决此问题的几个选项。当你在那里时,请投票。

    【讨论】:

    • 感谢基思的输入。我对 MS 连接项目投了赞成票。
    【解决方案4】:

    我最近在玩这个问题。就我而言,我的变量内部带有点和空格。我将列出我试图让它运行的所有组合。

    测试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) 最终解决方案

    到目前为止,我找到的最佳解决方案是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
    

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多