В настоящее время я работаю над новым модулем PS и сценарием-оболочкой для создания виртуальных машин и связанных с ними виртуальных жестких дисков, и я понял, что мне нужно использовать пользовательский переключатель -PassThru
для передачи переменных из одной функции другому (если, конечно, у кого-то еще нет никаких идей).
Сам скрипт-обёртка:
Get-NewVHDPath -VMName $VMName | Select VMName,FreeSpace,LocalVHDPath,RemotePath,RemoteVHDPath,Server | New-CompanyVHD | New-CompanyVM
Мне нужно передать то, что я выбрал, как New-CompanyVHD
(который прекрасно работает), и * New-CompanyVM
(который жалуется, что значение $VMName
равно false
, поэтому сообщая, что переменные не передаются по конвейеру, а используются только функцией New-CompanyVHD
). Итак, я думаю мне нужно что-то вроде:
Get-NewVHDPath -VMName $VMName | Select VMName,FreeSpace,LocalVHDPath,RemotePath,RemoteVHDPath,Server | New-CompanyVHD -Passthru | New-CompanyVM
Я добавил переключатель -PassThru
к функции New-CompanyVHD
в модуле, но я не уверен, как я могу получить эту информацию и заставить ее перейти к следующей. Сама функция:
Function Get-NewVHDPath {
[cmdletbinding()]
Param(
[Parameter(Position = 0, ValueFromPipelineByPropertyName,
HelpMessage = "Please enter the name of the VM to create.")]
[string]$VMName,
[switch]$Passthru)
$Hypervisors = "Server1", "Server2", "Server3"
Log "The hypervisors to check are: $Hypervisors"
Log "Now querying the servers to determine how much space each has..."
$Space = Try {
Get-WmiObject Win32_LogicalDisk -ComputerName $Hypervisors | Where {$_.DeviceID -ne "C:"} | Select-Object PSComputerName, DeviceID,
@{Name = "NSize"; Expression = {[math]::Round(($_.Size / 1GB), 2)}},
@{Name = "NFreespace"; Expression = {[math]::Round(($_.Freespace / 1GB), 2)}}
}
Catch {
Return $_
}
If ($Space) {
Log "Query succeeded!"
Log "Now calculating space on $Hypervisor..."
# Determine the variables for the max drive size, the disk letter, and the server for the new VM
$Max = ($Space | Measure-Object -Property NFreespace -Maximum).Maximum
$LocalDrive = ($Space | Where {$_.NFreeSpace -eq $Max}).DeviceID
$RemoteDrive = $LocalDrive.Replace(":", "$")
$Server = ($Space | Where {$_.NFreeSpace -eq $Max}).PSComputerName
$RemotePath = "\\$Server\$RemoteDrive\Virtual Machines"
$RemoteVHDPath = "$Path\$VMName.vhdx"
$LocalVHDPath = "$LocalDrive\Virtual Machines\$VMName.vhdx"
# Output a custom object
$Properties = @{'VMName' = $VMName;
'Server' = $Server;
'RemotePath' = $RemotePath;
'LocalVHDPath' = $LocalVHDPath;
'RemoteVHDPath' = $RemoteVHDPath;
'FreeSpace' = $Max
}
$Object = New-Object -TypeName psobject -Property $Properties | Select-Object Server, VMName, RemotePath, LocalVHDPath, RemoteVHDPath, FreeSpace
Write-Output $Object
}
Else {
Write-Output $Space
Log "Cannot determine free space on the Hypervisors. Exiting..."
Break
}
}
Любая помощь в этом, конечно, будет высоко ценится.