从文本文件导入变量并循环它的问题
Problem with import variable from text file and loop it
我正在尝试使用 PowerShell 编写脚本,但遇到困难。也许你可以给我发一个 link 或者给个小费?
我在 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 or london or moscow 时执行此脚本。
我该怎么办?如何在循环中将变量加载到 $username $ password。
我知道如何使用 BATCH 和 powershell 来完成,但我必须在 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
我会这样做。首先,导入您的服务器列表,然后遍历它以决定要在哪些服务器上工作...
#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 和 headers,它会更具可读性。这是一个例子...
<#
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
}
}
}
我正在尝试使用 PowerShell 编写脚本,但遇到困难。也许你可以给我发一个 link 或者给个小费?
我在 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 or london or moscow 时执行此脚本。
我该怎么办?如何在循环中将变量加载到 $username $ password。
我知道如何使用 BATCH 和 powershell 来完成,但我必须在 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
我会这样做。首先,导入您的服务器列表,然后遍历它以决定要在哪些服务器上工作...
#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 和 headers,它会更具可读性。这是一个例子...
<#
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
}
}
}