Пользовательский -PassThru Switch для функции PowerShell - PullRequest
0 голосов
/ 28 июня 2018

В настоящее время я работаю над новым модулем 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
    }
}

Любая помощь в этом, конечно, будет высоко ценится.

1 Ответ

0 голосов
/ 28 июня 2018

С моей стороны явно мозговой пердун ...

Log "This is a test run! VMname has been set to $VMName!"

$ VMVar = Get-NewVHDPath -VMName $ VMName | Выберите VMName, VHDSize, Сервер, LocalVMPath, LocalVHDPath $ VMVar | New-CompanyVHD $ VMVar | New-CompanyVM

Работает отлично.

...