Проблема с импортом переменной из текстового файла и ее зацикливание - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь написать скрипт с помощью 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. учетная запись домена servername
  2. учетная запись домена servername
  3. учетная запись домена servername

и теперь я пытаюсь сделать мой скрипт на многих серверах в списке, но не на всех серверах в списке. Например, используйте этот сценарий только там, где город = Берлин, Лондон или Москва.

Что мне делать? Как загрузить переменную в $ username $ пароль в цикле.

Я знаю, как сделать это с 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 

1 Ответ

0 голосов
/ 10 июля 2019

Я бы сделал это так. Прежде всего, импортируйте свой список серверов, затем итерируйте его, чтобы решить, на каких серверах работать ...

#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 и генератор совпадений регулярных выражений для поиска Берлина, Лондона или Москвы в каждой строке вашего списка.

UPDATE

Для работы с большим массивом городов было бы намного удобнее читать, если вы работаете с 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' вы должны использовать index [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

        }

    }

}
...