首页 > 解决方案 > 将变量传递给 PowerShell 中的 cmd.exe 命令

问题描述

我正在尝试编写一个 powershell 脚本,它将远程登录到服务器并运行 cmd.exe 表达式,但我想将用户输入的变量传递给 cmd.exe 表达式。我是powershell的新手,主要是通过google fu学习的,所以希望它是我所缺少的一些简单的东西。请参阅下面的脚本:

$cred = read-host "Enter Username" - AsString
$pass = read-host "Enter Password" -AsSecureString
$startdate = read-host "Enter Start Date" -AsString
$enddate = read-host "Enter End Date" -AsString
cmd.exe /c "C:\users\mfinch\desktop\tms\repgen.exe name=mappayman user=$cred pass=$pass 
printmode=export selectall=y startdate=[$startdate] enddate=[$enddate] auto=c"

这是我使用的报告软件,它具有用于脚本的命令行参数,所以我试图传递所需的开始日期和结束日期,这样它就可以运行所有内容,而无需用户登录服务器(我已经解决了这个问题已经)。

标签: powershellcmdcommand-lineexpressioncommand-line-arguments

解决方案


从 powershell 向 cmd 传递参数时,您应该逐个传递每个参数。就像在问题的评论中讨论的那样,您提供的场景的正确语法是:

saps cmd.exe -argumentlist "/c", "C:\users\mfinch\desktop\tms\repgen.exe", "name=mappayman", "user=$cred", "pass=$pass", "printmode=export", "selectall=y", "startdate=[$startdate]", "enddate=[$enddate]", "auto=c"

并且由于这不起作用,您可能在将参数传递给文件时语法不正确,因此再次像注释一样,您应该删除括号([])。您的代码将是:

saps cmd.exe -argumentlist "/c", "C:\users\mfinch\desktop\tms\repgen.exe", "name=mappayman", "user=$cred", "pass=$pass", "printmode=export", "selectall=y", "startdate=$startdate", "enddate=$enddate", "auto=c"

但是,您的代码中还有另一个语法错误。当您读取$pass变量时,您将其作为安全字符串读取,然后加密密码值。在将其作为参数传递之前,您首先需要对其进行解密:

$pass = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
$pass = [Runtime.InteropServices.Marshal]::PtrToStringAuto($pass)

然后它将传递实际输入而不是输出的加密版本:

System.Security.SecureString

回显$pass变量时。这两个命令都是解密所必需的,因为没有第二个命令, pass 的输出将是一堆随机数。

所以总而言之,您的代码将是:

$cred = read-host "Enter Username" - AsString
$pass = read-host "Enter Password" -AsSecureString
$startdate = read-host "Enter Start Date" -AsString
$enddate = read-host "Enter End Date" -AsString
$pass = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
$pass = [Runtime.InteropServices.Marshal]::PtrToStringAuto($pass)
saps cmd.exe -argumentlist "/c", "C:\users\mfinch\desktop\tms\repgen.exe", "name=mappayman", "user=$cred", "pass=$pass", "printmode=export", "selectall=y", "startdate=$startdate", "enddate=$enddate", "auto=c"

如果密码是错误的,你可以把括号放回去。


推荐阅读