Odpowiednik echa w PowerShell do testowania skryptów

233

Chciałbym wyprowadzać zmienne i wartości w skrypcie PowerShell , ustawiając flagi i obserwując, jak dane stają się widoczne w całym skrypcie.

Jak mam to zrobić?

Na przykład, jaki byłby odpowiednik PowerShell dla następującego kodu PHP?

echo "filesizecounter: " . $filesizecounter 
Phill
źródło
Sprawdź edytor skryptów / debugger dostarczany z PowerGUI . Może być odpowiedni do tego, co robisz. Rozumiem, że Powershell 2 jest również wyposażony w debugger (ale nie próbowałem tego).
dan-gph

Odpowiedzi:

275

Istnieje kilka sposobów:

Write-Host: Napisz bezpośrednio do konsoli, nieuwzględnione w wynikach funkcji / cmdlet. Umożliwia ustawienie koloru pierwszego planu i tła.

Write-Debug: Napisz bezpośrednio do konsoli, jeśli $DebugPreferenceustawiono Kontynuuj lub Zatrzymaj.

Write-Verbose: Napisz bezpośrednio do konsoli, jeśli $VerbosePreferenceustawiono Kontynuuj lub Zatrzymaj.

Ten drugi jest przeznaczony do dodatkowych informacji opcjonalnych, Write-Debugdo debugowania (wydaje się, że pasuje w tym przypadku).

Dodatkowo : w skryptach PSH2 (przynajmniej) korzystających z wiązania cmdletów automatycznie pobierane są parametry -Verbosei -Debugprzełączane, lokalnie włączane Write-Verbosei Write-Debug(tj. Zastępujące zmienne preferencji) tak, jak robią to skompilowane polecenia cmdlet i dostawcy.

Richard
źródło
4
Zaletą Write-Debug i Write-Verbose jest to, że możesz zostawić swoje instrukcje debugowania w kodzie i po prostu włączyć dane wyjściowe, gdy potrzebujesz, używając odpowiedniej zmiennej preferencji. Oszczędza czas i jest przyjemną funkcją dla innych użytkowników twoich funkcji.
JasonMArcher
5
Chcesz także zapoznać się z ciągiem wyjściowym, ponieważ w przypadku każdego nietrywialnego obiektu musisz go użyć do przekształcenia obiektu w możliwy do wyświetlania ciąg przed użyciem jednego z tych trzech poleceń cmdlet Write *.
Jaykul,
113

Powershell ma echo mapowania aliasu Write-Output, więc:

echo "filesizecounter : $filesizecounter"

Justin R.
źródło
7
echoto pseudonim Write-Outputzgodnie z TechNet Microsoftu i omówiony tutaj
Glenn Lawrence
2
Dzięki Glenn, wygląda na to, że alias został ponownie mapowany w ciągu 6 lat od opublikowania tego. Co jest dobre, naprawdę nie należy używać Write-Host, ponieważ omija on potok. Zaktualizowałem swoją odpowiedź, aby to wskazać. Dzięki!
Justin R.,
3
Dlaczego nie chcesz ominąć potoku, jeśli wszystko, co chcesz, to echo wyjścia „debugowania” do konsoli w celu śledzenia wykonania skryptu? Write-Output ma dziwny efekt uboczny, w którym zawartość ostatniego wywołania Write-Output pozostawia się na stosie, zastępując dowolną zmienną, którą próbujesz jawnie zwrócić z funkcji. Tego rodzaju skutki uboczne wydają się być okropnym sposobem na zachowanie się języka.
Craig
33

PowerShell interpoluje, prawda?

W PHP

echo "filesizecounter: " . $filesizecounter 

można również zapisać jako:

echo "filesizecounter: $filesizecounter" 

W PowerShell coś takiego powinno odpowiadać twoim potrzebom:

Write-Host "filesizecounter: $filesizecounter"
John T.
źródło
9
PHP nie ma nic wspólnego z tym pytaniem
reggaeguitar,
25
Write-Host "filesizecounter : " $filesizecounter 
aforia
źródło
14

Zdecydowanie najłatwiejszym sposobem na echo w PowerShell jest po prostu utworzenie obiektu string i umożliwienie mu wygenerowania przez potok:

$filesizecounter = 8096
"filesizecounter : $filesizecounter"

Oczywiście rezygnujesz z pewnej elastyczności, gdy nie używasz metod Write- *.

Goyuix
źródło
9

echo jest aliasem dla Write-Output, chociaż wygląda tak samo jak Write-Host .

To nie jest Jaka jest różnica między echo i Write-Host w PowerShell? .

echo to alias zapisu i wyjścia, który zapisuje do strumienia wyjściowego Sukces. Umożliwia to przetwarzanie danych wyjściowych za pomocą potoków lub przekierowanie do plików. Write-Host zapisuje bezpośrednio w konsoli, więc dane wyjściowe nie mogą być dalej przekierowywane / przetwarzane.

Paul Fijma
źródło
8

Host zapisu działa dobrze.

$Filesize = (Get-Item $filepath).length;
Write-Host "FileSize= $filesize";
Ali Darabi
źródło
5

Nie wiem, czy mądrze to zrobić, ale możesz po prostu pisać

"filesizecounter: " + $filesizecounter

I powinien generować:

fileizecounter: wartość

Piotr
źródło
1
"filesizecounter: $filesizecounter"jest jeszcze krótszy.
jiggunjer
3

PowerShell ma aliasy dla kilku popularnych poleceń, takich jak echo. Wpisz następujące polecenie w PowerShell:

Get-Alias echo

aby uzyskać odpowiedź:

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

Nawet Get-Alias ​​ma alias gal -> Get-Alias. Możesz napisać, gal echoaby uzyskać alias echo.

gal echo

Inne aliasy są wymienione tutaj: 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
źródło
2

Spróbuj, Get-Content .\yourScript.PS1a zobaczysz treść skryptu.

możesz także wstawić ten wiersz do swojego kodu skryptowego:

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

Luis
źródło
Nie pokazuje przetworzonych wartości rzeczywistych (np. Podstawienie env var), więc nie jest odpowiedzią na zadane pytanie.
iisystems
0

Należy również wspomnieć, że Set-PSDebug jest podobny do echo onpolecenia wsadowego starej szkoły :

Set-PSDebug -Trace 1

Polecenie spowoduje wyświetlenie każdej linii skryptu wykonawczego:

Gdy Traceparametr ma wartość 1, każdy wiersz skryptu jest śledzony podczas działania. Gdy parametr ma wartość 2, śledzone są również przypisania zmiennych, wywołania funkcji i wywołania skryptów. Jeśli parametr Step jest określony, przed każdym wierszem skryptu zostanie wyświetlony monit.

lauxjpn
źródło