Eco equivalente in PowerShell per test di script


233

Vorrei generare variabili e valori in uno script di PowerShell impostando flag e vedendo i dati immersi in tutto lo script.

Come lo farei?

Ad esempio, quale sarebbe l'equivalente di PowerShell al seguente codice PHP?

echo "filesizecounter: " . $filesizecounter 

Controlla l'editor di script / debugger fornito con PowerGUI . Potrebbe essere adatto a quello che stai facendo. Capisco che Powershell 2 viene fornito anche con un debugger (ma non l'ho provato).
dan-gph,

Risposte:


275

Esistono diversi modi:

Write-Host: Scrive direttamente sulla console, non incluso nell'output di funzione / cmdlet. Consente di impostare il colore di primo piano e di sfondo.

Write-Debug: Scrivi direttamente sulla console, se $DebugPreferenceimpostato su Continua o Ferma.

Write-Verbose: Scrivi direttamente sulla console, se $VerbosePreferenceimpostato su Continua o Ferma.

Quest'ultimo è destinato a informazioni extra opzionali, Write-Debugper il debug (quindi sembrerebbe adattarsi in questo caso).

Ulteriori : in PSH2 (almeno) gli script che usano l'associazione cmdlet otterranno automaticamente i parametri -Verbosee -Debugcambieranno, abilitando localmente Write-Verbosee Write-Debug(cioè sovrascrivendo le variabili delle preferenze) come fanno i cmdlet compilati e i provider.


4
La cosa bella di Write-Debug e Write-Verbose è che puoi lasciare le tue istruzioni di debug nel tuo codice e attivare l'output quando ne hai bisogno usando la variabile di preferenza appropriata. Risparmia tempo ed è una bella funzionalità per gli altri utenti delle tue funzioni.
JasonMArcher,

5
Devi anche familiarizzare con Out-String, perché con qualsiasi oggetto non banale, dovrai usarlo per convertire l'oggetto in una stringa che può essere visualizzata prima di utilizzare uno di questi tre cmdlet Write- *.
Jaykul,

113

Powershell ha un'eco di mappatura alias a Write-Output, quindi:

echo "filesizecounter : $filesizecounter"


7
echoè un alias di Write-OutputMicrosoft TechNet e discusso qui
Glenn Lawrence,

2
Grazie Glenn, sembra che l'alias sia stato rimappato in 6 anni da quando l'ho pubblicato. Il che è positivo, in realtà non si dovrebbe usare Write-Host poiché bypassa la pipeline. Ho aggiornato la mia risposta per indicare questo. Grazie!
Justin R.,

3
Perché non dovresti bypassare la pipeline se tutto ciò che vuoi fare è l'eco "debug" dell'output sulla console per tracciare l'esecuzione di uno script? Write-Output ha uno strano effetto collaterale in cui il contenuto dell'ultima chiamata a Write-Output verrà lasciato nello stack, sovrascrivendo qualsiasi variabile che si tenta di restituire esplicitamente da una funzione. Effetti collaterali come quello sembrano un modo terribilmente complicato per un linguaggio di comportarsi.
Craig,

33

PowerShell interpola, no?

In PHP

echo "filesizecounter: " . $filesizecounter 

può anche essere scritto come:

echo "filesizecounter: $filesizecounter" 

In PowerShell qualcosa del genere dovrebbe soddisfare le tue esigenze:

Write-Host "filesizecounter: $filesizecounter"

9
PHP non ha nulla a che fare con nulla in questa domanda
reggaeguitar,

25
Write-Host "filesizecounter : " $filesizecounter 

14

Di gran lunga il modo più semplice per echeggiare in PowerShell, è semplicemente creare l'oggetto stringa e lasciare che la pipeline lo emetta:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

Naturalmente, si rinuncia alla flessibilità quando non si utilizzano i metodi Write- *.



8

L'host di scrittura funziona correttamente.

$Filesize = (Get-Item $filepath).length;
Write-Host "FileSize= $filesize";

5

Non so se è saggio farlo, ma puoi semplicemente scrivere

"filesizecounter: " + $filesizecounter

E dovrebbe produrre:

filesizecounter: valore


1
"filesizecounter: $filesizecounter"è ancora più breve.
jiggunjer,

3

PowerShell ha alias per diversi comandi comuni come echo. Digitare quanto segue in PowerShell:

Get-Alias echo

per ottenere una risposta:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           echo -> Write-Output

Anche Get-Alias ​​ha un alias gal -> Get-Alias. Puoi scrivere gal echoper ottenere l'alias per echo.

gal echo

Altri alias sono elencati qui: https://docs.microsoft.com/en-us/powershell/scripting/learn/using-familiar-command-names?view=powershell-6

cat dir mount rm cd echo move rmdir chdir erase popd sleep clear h ps sort cls history pushd tee copy kill pwd type del lp r write diff ls ren


2

Prova Get-Content .\yourScript.PS1e vedrai il contenuto della tua sceneggiatura.

inoltre puoi inserire questa riga nel tuo codice script:

get-content .\scriptname.PS1
script code
script code

....


Non mostra i valori effettivi elaborati (es. Sostituzione env var), quindi non una risposta alla domanda posta.
iisystems,

0

Va anche detto che Set-PSDebug è simile al echo oncomando batch della vecchia scuola :

Set-PSDebug -Trace 1

Questo comando comporterà la visualizzazione di ogni riga dello script in esecuzione:

Quando il Traceparametro ha un valore di 1, ogni riga di script viene tracciata durante l'esecuzione. Quando il parametro ha un valore di 2, vengono tracciate anche le assegnazioni delle variabili, le chiamate di funzione e le chiamate di script. Se viene specificato il parametro Step, viene richiesto prima che ogni riga dello script venga eseguita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.