2010-01-10 26 views
146

Używam skrypt PowerShell z pliku wsadowego. Skrypt pobiera stronę internetową i sprawdza, czy treść strony jest łańcuchem "OK".Jak wypisać coś w PowerShell

Skrypt programu PowerShell zwraca poziom błędu skryptowi wsadowemu.

Skrypt wsadowy jest wykonywany przez ScriptFTP, program automatyzujący FTP. Jeśli wystąpi błąd, skrypt ScriptFTP może wysłać pełne dane wyjściowe konsoli do administratora za pośrednictwem poczty e-mail.

W skrypcie PowerShell, chciałbym wyprowadzić wartość zwracaną z witryny internetowej, jeśli nie jest "OK", więc komunikat o błędzie zostanie dołączony do wyjścia konsoli, a tym samym do wiadomości statusu.

Jestem nowy w programie PowerShell i nie jestem pewien, która funkcja wyjściowa do tego służy. Widzę trzy:

  • Write-Host
  • Write-Output
  • Write-Error

Co byłoby słuszne użyć zapisu ekwiwalent windowsowej stdout?

Odpowiedz

152

Generowanie czegoś po prostu to PowerShell to rzecz piękna - i jedna z jego największych zalet. Na przykład wspólny Hello, World!Aplikacja jest zredukowana do jednej linii:

"Hello, World!" 

tworzy obiekt String, wyznacza wspomnianą wartość, a będąc na ostatniej pozycji na rurociągu polecenia wywołuje metodę .toString() i wysyła wynik do STDOUT (domyślnie) . Rzecz piękna.

Pozostałe polecenia Write-* są specyficzne dla wyprowadzania tekstu do powiązanych z nim strumieni i mają swoje miejsce jako takie.

+4

To nie jest tak naprawdę, co się dzieje. Jest to wyrażenie dosłowne i jedyna w jego trakcie. W związku z tym jest to odpowiednik słowa "Hello, World!" | Out-Host'. Natomiast "Out-Host" wysyła obiekty do hosta PowerShell w celu wyświetlenia, a jego implementacja zależy od hosta. Host konsoli wysyła je do standardowego uchwytu wyjściowego (przepuszczając przez to 'Out-Default' po drodze). Program PowerShell ISE wyświetla je w panelu wyjściowym, a inne hosty mogą wykonywać całkowicie inne czynności. – Joey

+3

Obiekty nie są ślepo przekształcane na ciąg znaków, ale przechodzą przez _formatter_, który decyduje o tym, co z nimi zrobić. Dlatego widzisz na przykład wynik "Get-ChildItem" w postaci tabeli i wyniki z wieloma właściwościami (np. WMI) domyślnymi zamiast "Format-List". – Joey

6

Możesz użyć dowolnego z nich w swoim scenariuszu, ponieważ zapisują one do domyślnych strumieni (wyjście i błąd). Jeśli wyprowadzałeś dane wyjściowe do innego komendy, powinieneś użyć Write-Output, która ostatecznie zakończy się Write-Host.

Ten artykuł opisuje różne opcje wyjściowe: PowerShell O is for Output

+1

Dzięki za link. Boże, to jest * skomplikowane *. Jeśli Write-host jest jakimś rodzajem funkcji punktu końcowego lub płukania, spróbuję i pójdę z tym i zgłoś się. –

91

myślę, że w tym przypadku trzeba będzie Write-Output.

Jeśli masz skrypt jak

Write-Output "test1"; 
Write-Host "test2"; 
"test3"; 

wtedy, jeśli wywołanie skryptu z przekierowany, coś yourscript.ps1 > out.txt, dostaniesz test2 na ekranie test1\ntest3\n w „out.txt”.

Zauważ, że "test3" i wiersz "Write-Output" zawsze dodają nową linię do twojego tekstu i nie ma możliwości w PowerShell, aby to zatrzymać (to znaczy, że echo -n jest niemożliwe w PowerShell z natywnymi poleceniami). Jeśli chcesz (nieco podstawowe i łatwe w Bash) funkcjonalności echo -n, zobacz samthebest's answer.

Jeśli plik wsadowy uruchamia polecenie PowerShell, najprawdopodobniej wykona komendę Write-Output. Prowadziłem "długie dyskusje" z administratorami systemu na temat tego, co powinno być napisane na konsoli, a co nie. Zgodziliśmy się teraz, że jedyną informacją, czy skrypt został wykonany pomyślnie czy nie, musi być Write-Host 'ed, a wszystko, co jest autorem skryptu, może wymagać informacji o wykonaniu (jakie pozycje zostały zaktualizowane, jakie pola zostały ustawione itd.) idzie do zapisu-wyjścia. W ten sposób, po przesłaniu skryptu do administratora systemu, może on łatwo runthescript.ps1 >someredirectedoutput.txt i zobaczyć na ekranie, jeśli wszystko jest w porządku. Następnie wyślij "someredirectedoutput.txt" z powrotem do programistów.

1

Po prostu nie można przekonwertować programu PowerShell na te nieznośne znaki nowej linii. Nie ma skryptu ani cmdletu, który to robi.

Oczywiście Write-Host jest absolutnym nonsensem, ponieważ nie można go przekierować/potokować! Wystarczy napisać własny:

using System; 

namespace WriteToStdout 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args != null) 
      { 
       Console.Write(string.Join(" ", args)); 
      } 
     } 
    } 
} 

E.g.

PS C:\> writetostdout finally I can write to stdout like echo -n 
finally I can write to stdout like echo -nPS C:\> 
+0

Możesz to zrobić w samej powłoce. [System.Console] :: Write ("stringy") Jednak nie będziesz w stanie przekierować go w ogóle w powershell. – Nicholi

+0

Pewnie, że możesz. Zobacz [to pytanie] (http://stackoverflow.com/questions/3896258/how-to-output-text-without-newline-in-powershell). –

-10

pomocą zewnętrznego programu jak w od wewnątrz skryptu PowerShell:

cmd /c echo "Long string: $LongStr" 

To głupie i kosztowne pod względem prowadzenia oddzielnego procesu, ale PowerShell jest źle zaprojektowane.

+11

Nie masz pojęcia, o czym mówisz. Wystarczająco powiedziane. – jebar8

+0

Wiem, że nie powinienem, ale lol –

2
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta 

Magenta może być jedną z wartości wyliczający "System.ConsoleColor" - czarny, granatowy, DarkGreen, DarkCyan, darkred, DARKMagenta, ciemnożółty, Szary, DarkGray, niebieski, zielony, błękitny, czerwony, purpurowy, Żółto-biały.

Opcja + $File.FullName jest opcjonalna i pokazuje, jak umieścić zmienną w łańcuchu.

5

Myślę, że poniżej jest dobry wystawa Echo vs. Write-Host. Zauważ, jak test() faktycznie zwraca tablicę intów, a nie pojedynczą int, którą można łatwo skłonić do uwierzenia.

function test { 
    Write-Host 123 
    echo 456 # AKA 'Write-Output' 
    return 789 
} 

$x = test 

Write-Host "x of type '$($x.GetType().name)' = $x" 

Write-Host "`$x[0] = $($x[0])" 
Write-Host "`$x[1] = $($x[1])" 

Terminal wyjściowy z powyższym:

123 
x of type 'Object[]' = 456 789 
$x[0] = 456 
$x[1] = 789 
Powiązane problemy