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

jv4diomz  于 2023-10-18  发布在  Shell
关注(0)|答案(1)|浏览(104)

我试着写一个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文件。

p1tboqfb

p1tboqfb1#

  • 定义 * 你的函数如下:
function ExecuteSQLScript($sqlfile, $dbconnection) {
    @() | sqlplus $dbconnection "@$sqlfile"
}
  • @() | ...是PowerShell的cmd.exe<NUL的等价物(PowerShell没有<运算符); @()是一个空数组,它在管道中被枚举,因此不向外部程序的stdin流发送任何东西。
  • 用于调用的&只需要用于 * 带引号 * 和/或包含 * 变量引用 * 的命令名;虽然您可以使用& sqlplus ...,但只需sqlplus ...即可。
  • 本身充当命令参数的变量引用(上面的$dbonnection)在PowerShell中永远不需要引号(除非你想预先显式强制字符串化,例如,"$dbconnection"
  • @在PowerShell中是一个 * 元字符 *,所以它必须被转义或在一个带引号的字符串中;这里,可扩展(双引号)字符串("...")既用于逐字使用@,又用于使用字符串插值(扩展)来附加$sqlfile的值。

例如,如下所示:

# Note: *Whitespace* between arguments, no (...)
ExecuteSQLScript 'c:\test.sql 'testing/password@db'
  • 也就是说,PowerShell函数、小工具、脚本和外部程序必须像shell命令一样调用 * -foo arg1 arg2- * 而不是像C#方法一样调用 *-foo('arg1', 'arg2')

如果使用,来分隔参数,则将构造一个 * 数组 *,命令将其视为 * 单个参数 *。
有关详细信息,请参阅this answerthis answer

相关问题