powershell - 将变量传递给 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"
这是我使用的报告软件,它具有用于脚本的命令行参数,所以我试图传递所需的开始日期和结束日期,这样它就可以运行所有内容,而无需用户登录服务器(我已经解决了这个问题已经)。
解决方案
从 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"
如果密码是错误的,你可以把括号放回去。
推荐阅读
- python - python通过比较语音(语音)进行人工身份验证
- r - ggplot2:对同一组的不同系列使用不同的线型
- c++ - 提供 C++ Singleton 类库但在库外提供 instance() 方法是否可以接受
- intellij-idea - 以 IntelliJ GUI 形式添加动作侦听器时的空指针
- gradient - 如何在没有优化器的情况下将梯度设置为零?
- php - 如何在使用活动记录的框架中实现模型工厂?
- mysql - 在 aws 上使用 lambda 将 json api 数据插入 mysql rds
- laravel - Laravel - 在模型构造函数上重定向
- sql-server - OData 源预览错误:列填充权重之和不能超过 65535
- java - 从 Maven 中的本地 jar 文件生成源