Windows-Server-2003

如何組合兩個foreach循環?

  • June 5, 2015

我已經研究瞭如何將多個命令與 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     
   }
}

引用自:https://serverfault.com/questions/696660