所以我一直在尝试编写一个脚本,我在其中运行带参数的可执行文件,以返回监视所需的一些信息。不久前,我编写了一个成功设法完成此操作的脚本,使用以下命令:
$command = "-t vtl -p {1} -m {0} -s"
$check = Invoke-Expression -command ("$exemap\$exe $command" -f $server,$poort)
这完美无缺。但是,我正在编写一个新脚本,完全相同的东西似乎不再起作用了。这是我必须重现问题的脚本:
$omgeving = "A"
$exemap = "\\cfc01.corp\rpa-{0}\Scripts\Check_actualiteit_RPA" -f $omgeving
#$exe = "echoargs.exe"
$exe = "stmmon.exe"
$exepath = "$exemap\"+"$exe"
$commando = "-t {0} -p {1} -m {2} -s"
$poort = "5062"
$berichttype = "VTL"
$server = "rpa-a-ap001"
$command = ($commando -f $berichttype,$poort,$server) -split " "
#$command = "-t VTL -p 5062 -m rpa-a-ap001 -s"
& $exepath $command
所以我已经否定了一些用于故障排除的行。我尝试使用上面的Invoke-Expression
命令并使用&
运算符。我用Google搜索并尝试了很多。我尝试过使用工作和Invoke-Command
。但是所有这些都有相同的结果,exe的解释告诉我如何使用它:
Usage: \\cfc01.corp\rpa-A\Scripts\Check_actualiteit_RPA\stmmon.exe [-v] [-h] -t <type> -p <port> -m <machine> -k <key> [-s]
这让我相信可执行文件并不真正承认任何参数。我尝试使用echoargs,上面脚本的输出是:
Arg 0 is <-t>
Arg 1 is <VTL>
Arg 2 is <-p>
Arg 3 is <5062>
Arg 4 is <-m>
Arg 5 is <rpa-a-ap001>
Arg 6 is <-s>
或者,如果我在$ command变量中不使用-split“”,那么echoargs是这样的:
Arg 0 is <-t VTL -p 5062 -m rpa-a-ap001 -s>
上面的脚本可能不是很动态,但我试图制作的实际脚本将是。参数列表应该是可配置的和动态的,这就是我在不同场合使用-f
命令的原因。
任何人都可以看到我在这里做错了,为什么可执行文件甚至不会承认参数的存在?
答案 0 :(得分:0)
使用call operator(&
)运行外部命令。使用Join-Path
构建路径。使用splatting将参数传递给程序或函数。
$omgeving = "A"
$exemap = "\\cfc01.corp\rpa-$omgeving\Scripts\Check_actualiteit_RPA" -f
$exe = "stmmon.exe"
$exepath = Join-Path $exemap $exe
$params = '-t', 'VTL',
'-p', 5062,
'-m', 'rpa-a-ap001',
'-s'
& $exepath @params
另外,从帮助输出判断,您似乎缺少必需的参数:
Usage: \\...\stmmon.exe [-v] [-h] -t <type> -p <port> -m <machine> -k <key> [-s]
如果其他一切都失败了,请尝试将其作为解决方法:
$type = 'VTL'
$port = 5062
$server = 'rpa-a-ap001'
& cmd /c ('"{0}" -t {1} -p {2} -m {3} -s' -f $exepath, $type, $port, $server)
答案 1 :(得分:0)
我很遗憾浪费了人们在这里的时间。 我在这里发现了这个问题。显然,“类型”参数不允许使用大写字母。我还没有尝试改变这些,但它似乎解决了这个问题。