Windows-Server-2003
如何組合兩個foreach循環?
我已經研究瞭如何將多個命令與 psexec 結合使用,但似乎沒有一種方法有效。也許是因為我在 PowerShell 而不是 cmd.exe 中執行腳本?
我需要創建使用者帳戶並將它們添加到非域電腦(Windows 2003)上的本地管理員組。我已經派生了以下腳本(有效),但我想知道是否有一種簡單的方法可以組合兩個 foreach 循環,因為它必須為每個伺服器建立兩次 psexec 連接。
$username = Read-Host "User name:" $password = Read-Host "Password:" $fullname = Read-Host "Full name:" $computers = Get-Content C:\Tools\scripts\ServerList.txt foreach ($computer in $computers) { psexec \\$computer -u username -p password net user $username $password /add /fullname:""$fullname"" /comment:"Comment" } foreach ($computer in $computers) { psexec \\$computer -u username -p password net localgroup Administrators $username /add }
正如我所提到的,這是在 PowerShell 中執行的。我執行它的伺服器是未安裝 PowerShell 的 Workgroup Windows 2003 Servers。
正如@CIA 所說,您可以通過
psexec
在一個循環中執行兩次來組合這些循環。$username = Read-Host "User name:" $password = Read-Host "Password:" $fullname = Read-Host "Full name:" $computers = Get-Content C:\Tools\scripts\ServerList.txt foreach ($computer in $computers) { psexec \\$computer -u username -p password net user $username $password /add /fullname:""$fullname"" /comment:"Comment" psexec \\$computer -u username -p password net localgroup Administrators }
但似乎您真正要問的是如何在單個會話中執行兩個net 命令。
psexec
$username = Read-Host "User name:" $password = Read-Host "Password:" $fullname = Read-Host "Full name:" $computers = Get-Content C:\Tools\scripts\ServerList.txt foreach ($computer in $computers) { psexec \\$computer -u username -p password net user $username $password ullname"" /comment:"Comment" ^&^& net localgroup Administrators }
您可以嘗試這種方式,但我不確定它是否會起作用。使用
&&
轉義,^
以便將其傳遞給psexec
而不是在本地解釋,然後在net
本地執行第二個命令。選擇
相反,您可以做的是根本不使用
psexec
並使用 PowerShell 遠端處理。只需在您要遠端訪問的每台機器上啟用它。我意識到這可能是一項艱鉅的任務,但它是值得的,因為它更加通用,而且基本上,這是未來。如果您在域中,您甚至可以使用組策略來啟用 PowerShell 遠端處理(完全披露:這是我的文章)。
如果這樣做,您的程式碼將如下所示:
$username = Read-Host "User name:" $password = Read-Host "Password:" $fullname = Read-Host "Full name:" $computers = Get-Content C:\Tools\scripts\ServerList.txt foreach ($computer in $computers) { Invoke-Command -ComputerName $computer -ArgumentList $username,$password,$fullname -ScriptBlock { param($u,$p,$f) # Everything in here is executed on the remote computer net user $u $p /add /fullname:""$f"" /comment:"Comment" net localgroup Administrators } }