2015-04-13 13 views
7

Sto provando a utilizzare i parametri con nome [ref]. Tuttavia, sto ottenendo un errore:Come definire parametro denominato come [ref] in PowerShell

workflow Test 
{ 
    Param([Parameter(Mandatory=$true)][String][ref]$someString) 

    write-verbose $someString -Verbose 
    $someString = "this is the new string" 
} 

cls 
$someString = "hi" 
Test -someString [ref]$someString 
write-host $someString 

#Error: Cannot process argument transformation on parameter 'someString'. Reference type is expected in argument. 

Come posso risolvere questo problema?

risposta

17

Ho notato che stai utilizzando un "flusso di lavoro" nell'esempio di un parametro [ref]. Per semplicità, chiamiamola una "funzione" e torna a "flusso di lavoro" più tardi.

ci sono tre cose che dovete cambiare nel codice:

  1. Quando si passa un parametro [ref] di funzionare, è necessario racchiudere il parametro tra parentesi().
  2. Quando si utilizza un parametro [ref] all'interno di una funzione, fare riferimento a $ variabile.valore
  3. Rimuovere il tipo [stringa] dalla definizione del parametro. Può essere una [stringa] o [ref], ma non entrambi.

Ecco il codice che funziona:

function Test 
{ 
    Param([Parameter(Mandatory=$true)][ref]$someString) 

    write-verbose $someString.value -Verbose 
    $someString.value = "this is the new string" 
} 
cls 
$someString = "hi" 
Test -someString ([ref]$someString) 
write-host $someString 

Per quanto riguarda i "flussi di lavoro". Sono molto limitati, leggi PowerShell Workflows: Restrictions. In particolare, non è possibile richiamare un metodo su un oggetto all'interno del flusso di lavoro. Questo si romperà la linea:

$someString.value = "this is the new string" 

Non credo che l'utilizzo di [REF] parametri in un flusso di lavoro è pratico, a causa delle restrizioni del flusso di lavoro.

+0

Scriverete un'altra risposta sul flusso di lavoro? –

+0

Questo in realtà non risponde alla mia domanda in quanto funziona solo con le funzioni, non con i flussi di lavoro. –

+0

Ho aggiunto la parte "flusso di lavoro" alla risposta. –

2

Ho sentito la necessità di scrivere questa risposta semplicistica complementare poiché questo è stato il primo hit di Google durante la ricerca di informazioni sull'utilizzo dei parametri di riferimento nelle funzioni di PowerShell. Anche se la tua domanda non era sulle funzioni, ma flussi di lavoro:

Esempio di utilizzo di parametri di riferimento nelle funzioni (non funziona con il flusso di lavoro):

Function myFunction ([ref]$aString) { <br> 
    $aString.Value = "newValue"; <br> 
} <br> 
$localVariable = "oldValue" <br> 
Write-Host $localVariable # Outputs: oldValue <br> 
myFunction ([ref]$localVariable); <br> 
Write-Host $localVariable # Outputs: newValue <br> 

Con le funzioni si possono definire dei parametri per essere sia un punto di riferimento e un altro tipo , come questo (ma non con i flussi di lavoro):

Function myFunction ([ref][string]$aString) { <br> 
    $aString.Value = "newValue"; <br> 
} <br> 
$localVariable = "oldValue" <br> 
Write-Host $localVariable # Outputs: oldValue <br> 
myFunction ([ref]$localVariable); <br> 
Write-Host $localVariable # Outputs: newValue <br> 

sono d'accordo con Jan, non si dovrebbe cercare di utilizzare i parametri di riferimento nei flussi di lavoro a causa delle restrizioni del flusso di lavoro (chiamata di metodo su oggetti): https://blogs.technet.microsoft.com/heyscriptingguy/2013/01/02/powershell-workflows-restrictions/

Problemi correlati