PowerShell:使用调用方的输入(参数)执行命令行

PowerShell: execute a command line with input (arguments) from the caller

提问人:rvpals 提问时间:9/14/2023 最后编辑:mklement0rvpals 更新时间:9/14/2023 访问量:51

问:

我正在尝试编写一个powershell脚本,当它执行时,它需要2个变量并将其传递给一个函数。该函数使用输入变量运行命令行。

法典:

function ExecuteSQLScript($sqlfile, $dbconnection) {
    & 'sqlplus ' $dbconnection' @'$sqlfile ' <nul'
}

main block:

    ExecuteSQLScript('c:\test.sql', 'testing/password@db')

*basically I want the command line to execute:
SQLPLUS testing/password@db @c:\test.sql < nul*

运行命令行以调用 SQLPLUS 以在 PowerShell 中执行 SQL 文件。

PowerShell 参数 IO 重定向

评论


答:

1赞 mklement0 9/14/2023 #1

按如下方式定义函数:

function ExecuteSQLScript($sqlfile, $dbconnection) {
    @() | sqlplus $dbconnection "@$sqlfile"
}
  • @() | ...是 PowerShell 的等效项(PowerShell 没有运算符); 是在管道中枚举的空数组,因此不会向外部程序的 stdin 流发送任何内容cmd.exe<NUL<@()

  • &因为只有引用和/或包含变量引用的命令名称才需要调用;虽然您可以使用 ,但就足够了。& sqlplus ...sqlplus ...

  • 本身充当命令参数的变量引用(如上所述)永远不需要在 PowerShell 中引用(除非您想预先显式强制字符串化,例如$dbonnection"$dbconnection")

  • @是 PowerShell 中的元字符,因此它必须转义或位于带引号的字符串内;在这里,可展开(双引号)字符串 (“...”) 既用于逐字使用,也用于使用字符串插值(扩展)来附加 的值。@$sqlfile

按如下方式调用它,例如:

# Note: *Whitespace* between arguments, no (...)
ExecuteSQLScript 'c:\test.sql 'testing/password@db'
  • 也就是说,PowerShell 函数、cmdlet、脚本和外部程序必须像 shell 命令一样调用,而不是像 C# 方法那样调用。
    如果用于分隔参数,则将构造一个命令将其视为单个参数的数组
    有关详细信息,请参阅此答案和此答案
    foo arg1 arg2foo('arg1', 'arg2'),