Echoäquivalent in PowerShell zum Testen von Skripten

232

Ich möchte Variablen und Werte in einem PowerShell- Skript ausgeben, indem ich Flags einrichte und sehe, dass sich die Daten im gesamten Skript immatrikulieren.

Wie würde ich das machen?

Was wäre beispielsweise die PowerShell, die dem folgenden PHP-Code entspricht?

echo "filesizecounter: " . $filesizecounter 
phill
quelle
Schauen Sie sich den Skript-Editor / Debugger an, der mit PowerGUI geliefert wird . Es kann für das geeignet sein, was Sie tun. Ich verstehe, dass Powershell 2 auch mit einem Debugger geliefert wird (aber ich habe es nicht ausprobiert).
Dan-Gph

Antworten:

275

Es gibt verschiedene Möglichkeiten:

Write-Host: Schreiben Sie direkt in die Konsole, die nicht in der Funktions- / Cmdlet-Ausgabe enthalten ist. Ermöglicht das Einstellen der Vordergrund- und Hintergrundfarbe.

Write-Debug: Schreiben Sie direkt in die Konsole, wenn Sie $DebugPreferenceauf Weiter oder Stopp eingestellt sind.

Write-Verbose: Schreiben Sie direkt an die Konsole, wenn $VerbosePreferenceauf Weiter oder Stopp eingestellt sind.

Letzteres ist für zusätzliche optionale Informationen Write-Debugzum Debuggen vorgesehen (scheint also in diesem Fall zu passen).

Zusätzlich : In PSH2 (zumindest) erhalten Skripte, die die Cmdlet-Bindung verwenden, automatisch die Parameter -Verboseund -Debugswitch, wodurch sie lokal aktiviert Write-Verboseund Write-Debug(dh die Präferenzvariablen überschrieben) wie kompilierte Cmdlets und Anbieter.

Richard
quelle
4
Das Schöne an Write-Debug und Write-Verbose ist, dass Sie Ihre Debug-Anweisungen in Ihrem Code belassen und die Ausgabe bei Bedarf mit der entsprechenden Voreinstellungsvariablen aktivieren können. Spart Zeit und ist eine nette Funktion für andere Benutzer Ihrer Funktionen.
JasonMArcher
5
Sie möchten sich auch mit Out-String vertraut machen, da Sie bei jedem nicht trivialen Objekt das Objekt konvertieren müssen, bevor Sie eines dieser drei Write- * Cmdlets verwenden.
Jaykul
113

Powershell hat ein Alias-Mapping-Echo Write-Output, also:

echo "filesizecounter : $filesizecounter"

Justin R.
quelle
7
echoist ein Alias Write-Outputgemäß Microsoft TechNet und wird hier
Glenn Lawrence
2
Danke Glenn, es sieht so aus, als ob der Alias ​​in den 6 Jahren, seit ich das gepostet habe, neu zugeordnet wurde. Was gut ist, sollte man Write-Host wirklich nicht verwenden, da es die Pipeline umgeht. Ich habe meine Antwort aktualisiert, um dies anzuzeigen. Vielen Dank!
Justin R.
3
Warum möchten Sie die Pipeline nicht umgehen, wenn Sie nur die Echo-Debug-Ausgabe an die Konsole senden möchten, um die Ausführung eines Skripts zu verfolgen? Write-Output hat einen seltsamen Nebeneffekt, bei dem der Inhalt des letzten Aufrufs von Write-Output auf dem Stapel verbleibt und alle Variablen überschreibt, die Sie explizit von einer Funktion zurückgeben möchten. Solche Nebenwirkungen fühlen sich für eine Sprache wie eine schrecklich verrückte Art an, sich zu verhalten.
Craig
33

PowerShell interpoliert, nicht wahr?

In PHP

echo "filesizecounter: " . $filesizecounter 

kann auch geschrieben werden als:

echo "filesizecounter: $filesizecounter" 

In PowerShell sollte so etwas Ihren Anforderungen entsprechen:

Write-Host "filesizecounter: $filesizecounter"
John T.
quelle
9
PHP hat nichts mit irgendetwas in dieser Frage zu tun
Reggaeguitar
25
Write-Host "filesizecounter : " $filesizecounter 
Aphorie
quelle
14

Der bei weitem einfachste Weg, um in Powershell zu widerhallen, besteht darin, einfach das String-Objekt zu erstellen und es von der Pipeline ausgeben zu lassen:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

Natürlich geben Sie etwas Flexibilität auf, wenn Sie die Write- * -Methoden nicht verwenden.

Goyuix
quelle
9

echo ist ein Alias ​​für Write-Output, obwohl es genauso aussieht wie Write-Host .

Es ist nicht Was ist der Unterschied zwischen Echo und Write-Host in Powershell? .

echo ist ein Alias ​​für Write-Output, der in den Success-Ausgabestream schreibt. Dadurch kann die Ausgabe über Pipelines verarbeitet oder in Dateien umgeleitet werden. Write-Host schreibt direkt in die Konsole, sodass die Ausgabe nicht weiter umgeleitet / verarbeitet werden kann.

Paul Fijma
quelle
8

Der Write-Host funktioniert einwandfrei.

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

Ich weiß nicht, ob es sinnvoll ist, dies zu tun, aber Sie können einfach schreiben

"filesizecounter: " + $filesizecounter

Und es sollte ausgegeben werden:

Dateizähler: Wert

Peter
quelle
1
"filesizecounter: $filesizecounter"ist noch kürzer.
Jiggunjer
3

PowerShell verfügt über Aliase für mehrere häufig verwendete Befehle wie echo. Geben Sie Folgendes in PowerShell ein:

Get-Alias echo

um eine Antwort zu erhalten:

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

Sogar Get-Alias ​​hat einen Alias gal -> Get-Alias. Sie könnten schreiben gal echo, um den Alias ​​für zu erhalten echo.

gal echo

Andere Aliase sind hier aufgelistet: 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

Russ Van Bert
quelle
2

Versuchen Get-Content .\yourScript.PS1 Sie es und Sie werden den Inhalt Ihres Skripts sehen.

Sie können diese Zeile auch in Ihren Scrip-Code einfügen:

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

....

Luis
quelle
Zeigt keine tatsächlich verarbeiteten Werte an (z. B. env var-Ersetzung), daher keine Antwort auf die gestellte Frage.
Iisystems
0

Es sollte auch erwähnt werden, dass Set-PSDebug dem echo onBatch-Befehl der alten Schule ähnlich ist :

Set-PSDebug -Trace 1

Dieser Befehl führt dazu, dass jede Zeile des ausführenden Skripts angezeigt wird:

Wenn der TraceParameter den Wert 1 hat, wird jede Skriptzeile während der Ausführung verfolgt. Wenn der Parameter den Wert 2 hat, werden auch Variablenzuweisungen, Funktionsaufrufe und Skriptaufrufe verfolgt. Wenn der Parameter Step angegeben ist, werden Sie aufgefordert, bevor jede Zeile des Skripts ausgeführt wird.

lauxjpn
quelle