Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как добавить исключение в foreach (http://forum.oszone.net/showthread.php?t=332192)

Nightwolf_82 29-12-2017 01:22 2787860

Как добавить исключение в foreach
 
Всем привет!

На Hyper-V хосте есть несколько десятков машин имена которых наичнаются на "HYPER - VMX" и "HYPER-DCX" (разница в пробеле между дефисом).
Для тех что именуются как "HYPER - VMX" нужно прописать расширенные ACL'ы вида:

Add-VMNetworkAdapterAcl -VMName "HYPER - VM1" -Direction Both -RemoteIPAddress 172.28.0.0/16 -Action Deny -Weight 1
Add-VMNetworkAdapterAcl -VMName "HYPER - VM1" -RemoteIPAddress 172.28.0.1 -Direction Both -Action Allow -Weight 2


Подскажите пожалуйста можно ли создать скрипт, который:
- Будет обрабатывать только те виртуальные машины, которые именуются по типу "HYPER - VMX" и не будет обрабатывать те, которые именуются по типу "HYPER-DCX".
- Позволит исключить из обработки несколько виртуальных машин которые именуются по типу "HYPER - VMX"
- Позволит применить ACL правила.

Как я понимаю скрип должен начинаться как то так:

$VMlist = Get-VM
(foreach $VM in $VMList)
{
Add-VMNetworkAdapterAcl -VMName "HYPER - VM1" -Direction Both -RemoteIPAddress 172.28.0.0/16 -Action Deny -Weight 1
Add-VMNetworkAdapterAcl -VMName "HYPER - VM1" -RemoteIPAddress 172.28.0.1 -Direction Both -Action Allow -Weight 2
}

Но как это скомпоновать вместе я не совсем понимаю.

Помогите пожалуйста.

Kazun 29-12-2017 08:51 2787881

Код:

$VMlist = Get-VM
$VMToExclude = "HYPER - VM100","HYPER - VM200"

foreach ($VM in $VMList)
{
        if($VM.VMName -match "HYPER\s?-\s?VM\d+" -and !($VMToExclude -contains $VM.VMName)) {
                Add-VMNetworkAdapterAcl -VMName $VM.VMName -Direction Both -RemoteIPAddress 172.28.0.0/16 -Action Deny -Weight 1
                Add-VMNetworkAdapterAcl -VMName $VM.VMName -RemoteIPAddress 172.28.0.1 -Direction Both -Action Allow -Weight 2
        }
}


Busla 29-12-2017 10:28 2787892

Это плохой подход.
Лучше выборку отделять от операций и написать примерно так:

$VMlist = Get-VM | Where-Object Name -match '^HYPER - VMX'

Nightwolf_82 02-01-2018 06:21 2788503

Ребят сделал так. Сначала с каждого гипервизора вытащил список машин и оставил в файле только те которые нужны.

Get-VM -ComputerName HV1 | Select-Object {$_.Name} | Out-File C:\VM1VM.txt

Далее вот так:

$VMlist = Get-Content C:\HV1VM.txt

foreach ($VM in $VMList)
{
Add-VMNetworkAdapterAcl -Direction Both -RemoteIPAddress 172.28.0.0/16 -Action Deny
Add-VMNetworkAdapterAcl -Direction Both -RemoteIPAddress 172.28.0.1 -Action Allow
}


Но в таком виде выйдет что-то типа:

Supply values for the following parameters:
VMName[0]:


Так как параметр -VMName (который является обязательным) в обеих строках пропущен.

Подскажите пожалуйста как список машин из файла HV1VM втиснуть внутрь цикла foreach.


Время: 15:59.

Время: 15:59.
© OSzone.net 2001-