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

时间:2019-07-10 17:55:22

标签: powershell powershell-remoting

我正在尝试使用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文件中我有一长串这样的东西

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

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

1 个答案:

答案 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

        }

    }

}