Public/Invoke-ISNuGetCommand.ps1

<#
.SYNOPSIS
    Invokes a NuGet command
.DESCRIPTION
    The Invoke-ISNuGetCommand cmdlet is a wrapper around NuGet.exe. Running the cmdlet will allow you to run various forms of NuGet commands.
    The output from the cmdlet will be the exact same as a running a regular instance of NuGet.exe with the same parameters.
    If an argument does not require a parameter, pass $null as the parameter.
.EXAMPLE
        $NuGetArguments = @{
            "SomePackageName" = $null
            '-NonInteractive' = $null
            -OutputDirectory' = C:\Temp\
        }
        Invoke-ISNuGetCommand -Action "install" -Arguments $NugetCommand
.INPUTS
    String, Hashtable
.OUTPUTS
    String
#>

function Invoke-ISNuGetCommand
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('list', 'install', 'setApiKey', 'sources', 'config', 'locals', 'update')]
        [string]$Action,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [hashtable]$Arguments
    )

    try
    {
        $argArr = @()
        $argArr += $Arguments.GetEnumerator() | Sort-Object Value | ForEach-Object {
            if (-not $_.Value)
            {
                '"{0}"' -f $_.Key
            }
            else
            {
                '-{0} "{1}"' -f $_.Key, $_.Value
            }
        }
        $argString = $argArr -join ' '

        $stdOutTempFile = [System.IO.Path]::GetTempFileName()
        $stdErrTempFile = [System.IO.Path]::GetTempFileName()

        $startProcessParams = @{
            FilePath               = $NUGET_EXE
            ArgumentList           = "$Action $argString"
            RedirectStandardError  = $stdErrTempFile
            RedirectStandardOutput = $stdOutTempFile
            Wait                   = $true
            PassThru               = $true
            NoNewWindow            = $true
        }

        Write-Verbose -Message ("Running command: {0} {1}" -f $startProcessParams.FilePath, $startProcessParams.ArgumentList)

        $cmd = Start-Process @startProcessParams
        $cmdOutput = Get-Content -Path $stdOutTempFile -Raw
        $cmdError = Get-Content -Path $stdErrTempFile -Raw
        if ($cmd.ExitCode -ne 0)
        {
            throw $cmdError
        } 
        else 
        {
            $cmdOutput
        }
    } 
    catch
    {
        $PSCmdlet.ThrowTerminatingError($_)
    } 
    finally
    {
        Remove-Item -Path $stdOutTempFile, $stdErrTempFile -Force
    }
}