我正在尝试使用PowerShell编写脚本,但被卡住了。也许您可以给我发送链接或给个提示?
我在PowerShell中编写命令,然后尝试在具有不同域的许多服务器上执行该命令:
$Username = 'domain\user'
$Password = 'password'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass
invoke-command -filepath \source_script.ps1 -computerName server07 -Credential $cred
在serverlist.txt文件中我有一长串这样的东西
,现在我尝试在列表中的许多服务器上执行脚本,但不是列表中的所有服务器。例如,仅在city = berlin或london或Moscow的情况下执行此脚本。
我该怎么办?如何循环将变量加载到$ username $ password中。
我知道如何使用具有Powershell的BATCH进行操作,但是我必须在PowerShell中进行操作
看看我的批处理文件,我之前是怎么做的:
FOR /F %%a IN (\my_list.txt) DO TYPE \server_list.txt | find.exe "%%a" >> %source_path%\temporary_list.txt
::my_list.txt is the list all off my variables
for /f "tokens=*" %%A in (\temporary_list.txt) do call :run_program %%A
:run_program
SET mycity=%1
SET myserver=%2
SET mycredentials=%3
SET mydomain=%4
psExec.exe -u %mydomain% %mycredentials% \\%myserver% blah blah blah, rest of script
答案 0 :(得分:0)
我会这样做。首先,导入服务器列表,然后对其进行迭代,以决定要在哪些服务器上工作...
#import your server list
$serverlist = Get-Content -path C:\path\to\serverlist.txt
#iterate over $serverlist, and only act on entries that match Berlin or London or Moscow, etc...
Foreach ($server in $serverlist | Where-Object {$_ -match ("Berlin|London|Moscow")}) {
Invoke-Command -ComputerName $server -Credential $cred -ScriptBlock {
#do work
}
}
此方法使用foreach循环和正则表达式匹配交流发电机在列表的每一行中查找柏林,伦敦或莫斯科。
更新
要处理大量的城市,如果您使用带有标题的csv,它将更具可读性。这是一个例子...
<#
import your server list as a csv
csv looks like this...
server,city,cred
server1,moscow,cred1
server2,london,cred1
server3,moscow,cred2
server4,berlin,cred1
#>
#import serverlist.csv...
$serverlist = Import-csv -path C:\scripts\lists\serverlist.csv
#import your city list...
$citylist = Get-Content -path C:\scripts\lists\citylist.txt
#iterate $serverlist and check if $citylist contains $_.City...
$serverlist | ForEach-Object {
if ($citylist.Contains($_.City)) {
Invoke-Command -ComputerName $_.Name -Credential $_.cred -ScriptBlock {
#do work
}
}
}
更新2
如果您使用的是.txt而不是.csv,则还可以在城市上进行匹配。
如果您的serverlist.txt看起来像这样...
服务器城市信誉
服务器城市信誉
服务器城市信誉
...您可以拆分$ serverlist的每一行并匹配数组索引值。 Powershell将从0开始索引,因此要在“ city”上进行匹配,您可以使用索引[1],依此类推...
$serverlist = Get-Content -path C:\scripts\lists\serverlist.txt
#import your city list...
$citylist = Get-Content -path C:\scripts\lists\citylist.txt
#iterate $serverlist
#split each row into a collection
#check if $citylist contains a match on index 1 (city 'column')...
$serverlist | ForEach-Object {
$serverInfo = ($_).split(" ")
if ($citylist.Contains($serverInfo[1])) {
Invoke-Command -ComputerName $serverInfo[0] -Credential $serverInfo[2] -ScriptBlock {
#do work
}
}
}