Używam skryptu PowerShell z pliku wsadowego. Skrypt pobiera stronę internetową i sprawdza, czy zawartość strony to ciąg „OK”.
Skrypt PowerShell zwraca poziom błędu do skryptu wsadowego.
Skrypt wsadowy jest wykonywany przez ScriptFTP , program do automatyzacji FTP. Jeśli wystąpi błąd, mogę poprosić ScriptFTP o przesłanie pełnego wyjścia konsoli do administratora za pośrednictwem wiadomości e-mail.
W skrypcie PowerShell chciałbym wyprowadzić zwracaną wartość ze strony internetowej, jeśli nie jest ona „OK”, więc komunikat o błędzie zostaje dołączony do wyjścia konsoli, a tym samym do wiadomości statusu.
Jestem nowy w PowerShell i nie jestem pewien, której funkcji wyjściowej użyć do tego. Widzę trzy:
- Host zapisu
- Zapis-wyjście
- Napisz błąd
Jaka byłaby właściwa rzecz do pisania w ekwiwalencie Windows stdout
?
źródło
"Hello, World!" | Out-Host
.Out-Host
z drugiej strony wysyła obiekty do hosta PowerShell w celu wyświetlenia, a jego implementacja zależy od hosta.Out-Default
Rzeczywiście host konsoli wysyła je do standardowego uchwytu wyjściowego (przechodząc po drodze). Jednak PowerShell ISE wyświetla je w okienku wyjściowym, a inne hosty mogą robić jeszcze inne rzeczy całkowicie.Get-ChildItem
na przykład dane wyjściowe w postaci tabeli, aFormat-List
zamiast nich wyniki z wieloma właściwościami (np. WMI) .Myślę, że w tym przypadku będziesz potrzebować Write-Output .
Jeśli masz skrypt podobny do
następnie, jeśli wywołasz skrypt z przekierowanym wyjściem, coś w rodzaju
yourscript.ps1 > out.txt
, pojawi siętest2
na ekranietest1\ntest3\n
w „out.txt”.Zauważ, że „test3” i wiersz Write-Output zawsze dołączają nowy wiersz do tekstu i nie ma możliwości, aby PowerShell to powstrzymał (to znaczy, że nie jest
echo -n
to możliwe w PowerShell z natywnymi poleceniami). Jeśli chcesz (nieco podstawowa i łatwa w Bash ) funkcjonalność,echo -n
zobacz odpowiedź samthebest .Jeśli plik wsadowy uruchamia polecenie PowerShell, najprawdopodobniej przechwyci polecenie Write-Output. Przeprowadziłem „długie dyskusje” z administratorami systemu na temat tego, co należy napisać na konsoli, a co nie. Uzgodniliśmy teraz, że jedyną informacją, czy skrypt wykonał się pomyślnie lub zmarł, musi być
Write-Host
„zredagowany” i wszystko, co jest autorem skryptu, może wymagać wiedzieć o wykonaniu (jakie elementy zostały zaktualizowane, jakie pola zostały ustawione itd.) do zapisu-wyjścia. W ten sposób, po przesłaniu skryptu do administratora systemu, może on łatworunthescript.ps1 >someredirectedoutput.txt
zobaczyć na ekranie, czy wszystko jest w porządku. Następnie odeślij plik „someredirectedoutput.txt” z powrotem do programistów.źródło
Myślę, że poniższe przedstawienie jest dobrym przykładem Echo vs. Write-Host . Zauważ, jak test () faktycznie zwraca tablicę liczb całkowitych, a nie pojedynczą liczbę całkowitą, w którą można łatwo uwierzyć.
Wyjście końcowe powyższego:
źródło
$x = test
drukuje,123
a nie także456
?Możesz użyć dowolnego z nich w scenariuszu, ponieważ zapisują one w domyślnych strumieniach (dane wyjściowe i błędy). Jeśli przesyłałeś dane wyjściowe do innego polecenia, powinieneś użyć Write-Output , które ostatecznie zakończy się w Write-Host .
W tym artykule opisano różne opcje danych wyjściowych: PowerShell O służy do danych wyjściowych
źródło
Magenta może być jedną z wartości modułu wyliczającego „System.ConsoleColor” - Czarny, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Szary, DarkGray, Niebieski, Zielony, Cyjan, Czerwony, Magenta, Żółty, Biały.
+ $File.FullName
Jest opcjonalny, i pokazuje, jak wprowadzić zmienną do łańcucha.źródło
Po prostu nie można zmusić programu PowerShell do opuszczenia tych irytujących nowych linii. Nie ma takiego skryptu ani polecenia cmdlet.
Oczywiście Write-Host jest absolutnym nonsensem, ponieważ nie można przekierować / potokować z niego! Musisz po prostu napisać własny:
Na przykład
źródło
W efekcie , ale bardzo niestety , zarówno Windows PowerShell , jak i PowerShell Core od wersji 7.0, wysyłają wszystkie swoje 6 (!) Strumienie wyjściowe na standardowe wyjście, gdy są wywoływane z zewnątrz , za pośrednictwem CLI PowerShell .
Zobacz ten problem GitHub, aby omówić to problematyczne zachowanie, które prawdopodobnie nie zostanie naprawione ze względu na kompatybilność wsteczną.
W praktyce oznacza to, że cokolwiek PowerShell strumieniu wysłać wyjście będzie postrzegana jako stdout wyjściu przez zewnętrznego rozmówcy:
Na przykład, jeśli uruchomisz następujące z
cmd.exe
, nie zobaczysz żadnych danych wyjściowych, ponieważ standardowe przekierowanie doNUL
stosuje się jednakowo do wszystkich strumieni PowerShell:C:\>powershell -noprofile -command "Write-Error error!" >NUL
Jednak - co ciekawe - jeśli przekierować stderr , PowerShell nie wysyłać jej strumień błędów na stderr , tak że z
2>
ty może przechwycić wyjście błędów strumienia selektywnie; tylko następujące wyniki'hi'
- wyjście strumienia sukcesu - podczas przechwytywania wyniku strumienia błędów w plikuerr.txt
:C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt
Pożądane zachowanie jest:
1
) do stdout .Wyślij dane wyjściowe ze wszystkich innych strumieni do stderr , co jest jedyną opcją, biorąc pod uwagę, że między procesami istnieją tylko 2 strumienie wyjściowe - stdout (standardowe wyjście) dla danych i stderr (standardowy błąd) dla komunikatów o błędach i wszystkie inne typy komunikatów - takie jako informacje o statusie - to nie są dane .
Wskazane jest wprowadzenie tego rozróżnienia w kodzie, nawet jeśli obecnie nie jest ono przestrzegane .
Wewnątrz programu PowerShell :
Write-Host
służy do wyświetlania danych wyjściowych i omija strumień wyjściowy sukcesu - jako taki, jego dane wyjściowe nie mogą być (bezpośrednio) uchwycone w zmiennej, ani tłumione, ani przekierowywane.Jego pierwotnym celem było po prostu tworzenie opinii użytkowników i tworzenie prostych interfejsów użytkownika opartych na konsoli (kolorowe wydruki).
Ze względu na wcześniejszej niezdolności do niewoli lub przekierowywany PowerShell w wersji 5 wykonane
Write-Host
na nowo wprowadzonego strumienia informacji (liczby6
), więc od tego czasu jest możliwe do przechwytywania i przekierowaćWrite-Host
wyjście.Write-Error
służy do zapisywania błędów nie kończących się w strumieniu błędów (liczba2
); koncepcyjnie strumień błędów jest odpowiednikiem stderr.Write-Output
zapisuje do strumienia powodzenia [wyjściowego] (liczba1
), który jest koncepcyjnie równoważny stdout; to strumień do zapisywania danych (wyników).Write-Output
jest rzadko potrzebne ze względu na domyślną funkcję wyjściową PowerShell :Write-Output "Honey, I'm $HOME"
i"Honey, I'm $HOME"
są równoważne, przy czym te ostatnie są nie tylko bardziej zwięzłe, ale także szybsze.źródło