簡體   English   中英

將變量傳遞給 PowerShell 中的 cmd.exe 命令

[英]Pass a variable to a cmd.exe command in PowerShell

我正在嘗試編寫一個 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 將 arguments 傳遞給 cmd 時,您應該將每個參數 1 逐 1 傳遞。就像在問題的評論中討論的那樣,您提供的場景的正確語法是:

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變量時。 這兩個命令都是解密所必需的,因為如果沒有第二個命令,則通過的 output 將是一堆隨機數。

所以總而言之,您的代碼將是:

$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"

如果密碼是錯誤的,你可以把括號放回去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM