从文本文件导入变量并循环它的问题

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 文件中有一长串类似这样的东西

  1. 城市服务器名凭据域
  2. 城市服务器名凭据域
  3. 城市服务器名凭据域

现在我正在尝试在列表中的许多服务器上执行我的脚本,但不是列表中的所有服务器。例如,仅在 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

        }

    }

}