【问题标题】:Error when attempting to parameterize a command with $ variables尝试使用 $ 变量参数化命令时出错
【发布时间】:2012-06-08 20:02:46
【问题描述】:

我正在尝试使用以下代码 sn-p 执行命令:

foreach($package in (Get-Childitem *.dtsx | select-object -expand Name))
{
    DTUTIL /COPY SQL;"\$package" /DESTSERVER "$global:SSISServer" /FILE "$package" /Q
}

但是这样做会导致以下错误消息:

You must provide a value expression on the right-hand side of the '/' operator.
At C:\Projects\RiskOptix\Code\Deployment\BuildAll.ps1:267 char:39
+         DTUTIL /COPY SQL;"\$package" / <<<< DESTSERVER "$global:SSISServer" /FILE "$package" /Q
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedValueExpression

我也试过

& DTUTIL "/COPY SQL;'\" + [System.IO.Path]::GetFileNameWithoutExtension($package) + "' /DESTSERVER '$global:SSISServer' /FILE $package"

但现在这给了我

Microsoft (R) SQL Server SSIS Package Utilities
Version 10.50.1600.1 for 32-bit
Copyright (C) Microsoft Corporation 2010. All rights reserved.

At least one of the DTS, SQL, or File options must be specified.

但至少命令运行了,但它似乎没有收到我发送给它的任何参数......我猜我在这里忽略或未能掌握 PowerShell 的基本概念。我哪里出错了?

【问题讨论】:

    标签: powershell powershell-2.0 powershell-ise


    【解决方案1】:

    将变量作为参数传递给命令时,您不需要引用它们。话虽如此,看起来您的命令中有一个流氓分号。分号在 PowerShell 中是可选的,但如果存在,则用作命令分隔符。在这种情况下,您需要引用带有分号的参数,或者为该参数创建一个变量:

    Get-Childitem *.dtsx | 
        Select-Object -expand Name |
        ForEach-Object { DTUTIL /COPY "SQL;\$package" /DESTSERVER $global:SSISServer /FILE $package /Q
    

    我从未使用过diutil,所以不知道命令参数或语法。

    【讨论】:

    • 这行得通 - 我想我的问题是不了解参数是如何从 PowerShell 传递给命令的 谢谢,这让我发疯了
    【解决方案2】:

    试试Invoke-Expression 喜欢:

    Invoke-Expression "DTUTIL /COPY SQL;`"\$package`" /DESTSERVER `"$global:SSISServer`" /FILE `"$package`" /Q"
    

    首先评估整个字符串,然后像普通命令一样将结果传递给powershell

    【讨论】:

    • 它仍然给我错误 Invoke-Expression : You must provide a value expression on the '/' operator.
    • 尝试: echo "DTUTIL /COPY SQL;"\$package" /DESTSERVER "$global:SSISServer" /FILE "$package" /Q" 并将输出设计为您在 win 批处理中运行的方式
    • 实际上这给了我这个想法——我使用了 echo "/COPY SQL;""\$package"" /DESTSERVER ""$global:SSISServer"" /FILE $package /Q" | DTUTIL ..令人惊讶的是它起作用了。像这样使用它有什么区别,vs &,vs Invoke-Method,vs 每个参数的多个字符串,例如 DTUTIL "/COPY SQL; '\$Package'" "/DESTSERVRER '$Server'" "/FILE $包""/Q"
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多