У меня есть следующий скрипт под названием vms.ps1
:
# Definições das VMs e grupos
$VMPaths = @{
"goad1" = "E:\GOAD\ad\GOAD\providers\vmware\.vagrant\machines\GOAD-DC01\vmware_desktop\d293bfc4-dc8c-4e82-9704-1506af10c065\WindowsServer2019.vmx"
"goad2" = "E:\GOAD\ad\GOAD\providers\vmware\.vagrant\machines\GOAD-DC02\vmware_desktop\73036daa-689c-4ea2-9c3b-86c308990822\WindowsServer2019.vmx"
"goad3" = "E:\GOAD\ad\GOAD\providers\vmware\.vagrant\machines\GOAD-DC03\vmware_desktop\c3ce3c4a-7e71-4068-8a37-877ac2587d8d\WindowsServer2016.vmx"
"goad4" = "E:\GOAD\ad\GOAD\providers\vmware\.vagrant\machines\GOAD-SRV02\vmware_desktop\a882d3d0-a4fe-406c-93fb-9c144ba97bab\WindowsServer2019.vmx"
"goad5" = "E:\GOAD\ad\GOAD\providers\vmware\.vagrant\machines\GOAD-SRV03\vmware_desktop\ef52fe4e-1fa6-48e2-9a27-b0c8bac67454\WindowsServer2016.vmx"
"syslog" = "F:\vmware\syslog-ng\Syslog-NG.vmx"
"qradar" = "F:\vmware\QRADAR\QRADAR.vmx"
"kali" = "F:\vmware\kali-linux-2024.2\kali-linux-2024.2-vmware-amd64.vmx"
"dockerhub" = "F:\vmware\Docker HUB\Docker HUB.vmx"
"edr-server" = "F:\vmware\Elastic EDR\Elastic EDR.vmx"
"flare" = "F:\vmware\FlareVM\FlareVM.vmx"
"pfsense" = "F:\vmware\pfSense 2.7.0\pfSense 2.7.0.vmx"
"win22" = "F:\vmware\Win2022\Win2022.vmx"
"win11-lab1" = "F:\vmware\Win11-Lab1\Win11-Lab1.vmx"
"win10-lab1" = "F:\vmware\Win10-Lab1\Win10-Lab1.vmx"
}
$VMGroups = @{
"goad" = @("goad1", "goad2", "goad3", "goad4", "goad5")
"siem" = @("syslog", "qradar")
"hardening" = @("syslog", "win22", "pfsense", "win11-lab1", "dockerhub")
}
# Função para listar VMs e grupos
function List-VMs {
Write-Host -ForegroundColor Cyan "VMs disponíveis:"
$VMPaths.Keys | ForEach-Object { Write-Host -ForegroundColor Green $_ }
Write-Host -ForegroundColor Cyan "`nGrupos disponíveis:"
foreach ($group in $VMGroups.Keys) {
Write-Host -ForegroundColor Yellow "`nGrupo: $group"
$VMGroups[$group] | ForEach-Object { Write-Host -ForegroundColor Green " $_" }
}
}
# Caminho do vmrun
$vmrunPath = "C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe"
# Função para iniciar VMs
function Start-VMs {
param (
[string[]]$VMNames
)
# Verificar se o primeiro parâmetro é um grupo
if ($VMNames[0] -eq "--group") {
$groupName = $VMNames[1]
if ($VMGroups.ContainsKey($groupName)) {
$VMNames = $VMGroups[$groupName]
} else {
Write-Host -ForegroundColor Yellow "Grupo não encontrado: $groupName"
return
}
}
# Iniciar VMs
foreach ($vmAlias in $VMNames) {
if ($VMPaths.ContainsKey($vmAlias)) {
$vm = $VMPaths[$vmAlias]
try {
& $vmrunPath start $vm
$vmName = [System.IO.Path]::GetFileNameWithoutExtension($vm)
Write-Host -ForegroundColor Cyan "VM Iniciada: " -NoNewline
Write-Host -ForegroundColor Green $vmName
} catch {
if ($_ -match "is already powered on") {
$vmName = [System.IO.Path]::GetFileNameWithoutExtension($vm)
Write-Host -ForegroundColor Yellow "VM já está ligada: " -NoNewline
Write-Host -ForegroundColor Green $vmName
} else {
throw $_
}
}
} else {
Write-Host -ForegroundColor Yellow "VM não encontrada: $vmAlias"
}
}
}
# Função para suspender VMs
function Suspend-VMs {
...
}
# Função para parar VMs
function Stop-VMs {
...
}
# Função para desligar VMs
function PowerOff-VMs {
...
}
Моя идея — запустить этот скрипт из ALIAS в терминале.
Мой powershell $ПРОФИЛЬ:
. "F:\vmware\vms.ps1"
function vm {
param (
[string]$Command,
[string[]]$VMNames
)
switch ($Command) {
"start" {
if ($VMNames[0] -eq "--group") {
Start-VMs -VMNames $VMNames
} else {
Start-VMs -VMNames $VMNames
}
}
"suspend" { Suspend-VMs @($VMNames) }
"stop" { Stop-VMs @($VMNames) }
"poweroff" { PowerOff-VMs @($VMNames) }
"list" { List-VMs }
default { Write-Host "Comando desconhecido: $Command" -ForegroundColor Red }
}
}
Когда я бегу:
vm list
: работа
vm start syslog
: работа
vm suspend syslog
: работа
Но:
vm start --group goad
: Не работай.
❯ vm start --group goad
MethodInvocationException: F:\vmware\vms.ps1:93
Line |
93 | if ($VMGroups.ContainsKey($groupName)) {
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Exception calling "ContainsKey" with "1" argument(s): "Value cannot be null. (Parameter 'key')"
VM não encontrada: --group
Я хочу этого, когда ставлю:
vm start --group goad
Скрипт запускает все виртуальные машины, находящиеся внутри группы goad в $VMGroups.
Только первый аргумент (--group
) связан с $VMNames
. Если вы хотите привязать все конечные аргументы к параметру, используйте декоратор атрибута Parameter
, чтобы установить флаг ValueFromRemainingArguments
:
param(
[Parameter(Mandatory = $true, Position = 0)]
[string]$Command
[Parameter(ValueFromRemainingArguments = $true)]
[string[]]$VMNames
)
Теперь, когда вы это сделаете vm start --group goad
, к "--group"
добавятся и "goad"
, и $VMNames
.
Вот и все! Это сработало! Вчера я не спал до часу ночи, пытаясь понять и отладить причину ошибки. Я попробовал несколько способов передать полный параметр и не знал, куда идти. Спасибо за помощь.