Chcę, aby mój skrypt PowerShell wydrukował coś takiego:
Enabling feature XYZ......Done
Skrypt wygląda mniej więcej tak:
Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
Ale Write-Output
zawsze wypisuje nowy wiersz na końcu, więc mój wynik nie znajduje się w jednym wierszu. Czy jest na to sposób?
powershell
Amit G.
źródło
źródło
Odpowiedzi:
źródło
Write-Output
, który ma znacznie inną funkcję niżWrite-Host
. Czytelnicy powinni zwrócić uwagę na tę dużą rozbieżność przed skopiowaniem / wklejeniem odpowiedzi.Write-Host
prawie nigdy nie jest właściwą odpowiedzią. To odpowiednik pracy>/dev/tty
w Unixlandzie.Write-Progress
może być odpowiednie w niektórych przypadkach, patrz przykład poniżej.Write-Output
.Write-Output
nie ma-NoNewLine
parametru.Niestety, jak zauważono w kilku odpowiedziach i komentarzach,
Write-Host
może być niebezpieczny i nie można go przesłać potokiem do innych procesów iWrite-Output
nie ma-NoNewline
flagi.Jednak metody te są „* nix” Sposoby progresji wyświetlacza, sposób „PowerShell” do zrobienia, że wydaje się być
Write-Progress
: wyświetla pasek w górnej części okna PowerShell z informacjami o postępach, dostępnego od PowerShell 3.0 dalszej, patrz instrukcja dla Detale.I weźmy przykład PO:
źródło
Chociaż może to nie działać w twoim przypadku (ponieważ dostarczasz użytkownikowi informacje wyjściowe), utwórz ciąg, którego możesz użyć do dołączenia wyniku. Kiedy nadejdzie czas, aby go wyprowadzić, po prostu wyślij ciąg.
Ignorując oczywiście, że ten przykład jest głupi w twoim przypadku, ale przydatny w koncepcji:
Wyświetlacze:
źródło
Write-Output
. Rozsądne obejście, ale nie rozwiązanie.Tak, ponieważ inne odpowiedzi mają stany, nie można tego zrobić za pomocą Write-Output. Tam, gdzie PowerShell nie działa, zwróć się do .NET, jest tu nawet kilka odpowiedzi dotyczących .NET, ale są one bardziej złożone niż powinny.
Po prostu użyj:
Nie jest to najczystszy PowerShell, ale działa.
źródło
Write-Host
, ale ludzie się tego nie spodziewają.Aby zapisać do pliku, możesz użyć tablicy bajtów. Poniższy przykład tworzy pusty plik ZIP, do którego można dodawać pliki:
Albo użyj:
źródło
Uproszczenie odpowiedzi FrinkTheBrave:
źródło
Problem, który napotkałem, polegał na tym, że Write-Output faktycznie przerywa linię wyjściową podczas korzystania z PowerShell v2, przynajmniej na stdout. Próbowałem napisać tekst XML na standardowe wyjście bez powodzenia, ponieważ byłby mocno zawinięty w znak 80.
Obejście polegało na użyciu
To nie był problem w PowerShell v3. Wydaje się, że funkcja Write-Output działa tam poprawnie.
W zależności od sposobu wywoływania skryptu programu PowerShell może być konieczne użycie
zanim napiszesz na standardowe wyjście.
źródło
Wydaje się, że nie ma sposobu, aby to zrobić w programie PowerShell. Wszystkie poprzednie odpowiedzi są niepoprawne, ponieważ nie zachowują się tak, jak się
Write-Output
zachowują, a raczej takie,Write-Host
które i tak nie mają tego problemu.Rozwiązanie close wydaje się używać
Write-Host
z-NoNewLine
parametrem. Nie można tego potokować, co jest ogólnie problemem, ale istnieje sposób na nadpisanie tej funkcji, jak opisano w Write-Host => Export do pliku , dzięki czemu można łatwo sprawić, by zaakceptował parametr dla pliku wyjściowego. To wciąż nie jest dobre rozwiązanie. DziękiStart-Transcript
temu jest bardziej użyteczny, ale to polecenie cmdlet ma problemy z aplikacjami natywnymi.Write-Output
po prostu nie możesz zrobić tego, czego potrzebujesz w ogólnym kontekście.źródło
Write-Host
jest okropny, niszczyciel światów, ale możesz go używać tylko do wyświetlania postępu użytkownikowi podczas korzystaniaWrite-Output
z logowania (nie to, że OP prosił o logowanie).źródło
Write-Progress
.Po prostu nie można zmusić PowerShell do pominięcia tych nieznośnych znaków nowej linii ... Nie ma takiego skryptu ani polecenia cmdlet. Oczywiście, Write-Host to absolutny nonsens, ponieważ nie można z niego przekierować / potokować!
Niemniej jednak możesz napisać własny plik EXE, aby to zrobić, co wyjaśniłem w pytaniu o przepełnienie stosu Jak wyprowadzić coś w PowerShell .
źródło
Odpowiedź Shuflera jest poprawna. Podane w inny sposób: Zamiast przekazywać wartości do Write-Output za pomocą ARRAY FORM,
lub ekwiwalent przez wielokrotne wywołania Write-Output,
najpierw połącz swoje komponenty w STRING VARIABLE:
Zapobiegnie to powstawaniu pośrednich list CRLF spowodowanych wielokrotnym wywołaniem Write-Output (lub ARRAY FORM), ale oczywiście nie pominie końcowego CRLF polecenia Write-Output. W tym celu będziesz musiał napisać własne polecenie, użyć jednego z innych zawiłych obejść wymienionych tutaj lub poczekać, aż Microsoft zdecyduje się obsługiwać
-NoNewline
opcję zapisu-wyjścia.Twoje pragnienie dostarczenia tekstowego miernika postępu do konsoli (tj. „…”) W przeciwieństwie do zapisywania do pliku dziennika, powinno być również zaspokojone przez użycie Write-Host. Możesz osiągnąć jedno i drugie, zbierając tekst msg do zmiennej w celu zapisania w dzienniku ORAZ używając Write-Host, aby zapewnić postęp konsoli. Funkcjonalność tę można połączyć we własne polecenie w celu maksymalnego ponownego wykorzystania kodu.
źródło
Write-Output
, po prostu nie możesz go zobaczyć, ponieważ jest to ostatnia rzecz zapisana. Rozsądne obejście, ale nie rozwiązanie. Może istnieć coś pochłaniającego wynikowe dane wyjściowe, co nie może obsłużyć końcowego znaku nowej linii.Poniższe instrukcje umieszczą kursor z powrotem na początku poprzedniego wiersza. Do Ciebie należy ustawienie go w odpowiedniej poziomej pozycji (używając $ pos.X, aby przesunąć go na boki):
Twoje aktualne wyjście ma 27 spacji, więc $ pos.X = 27 może działać.
źródło
$pos.X
również to zrobisz, może dać prawidłowe wyniki . Problem polega na tym, że jeśli przepuścisz go do pliku, pojawią się dwie oddzielne linie.Może nie jest strasznie elegancki, ale robi dokładnie to, o co prosił OP. Zauważ, że ISE miesza się ze StdOut, więc nie będzie wyjścia. Aby zobaczyć, jak działa ten skrypt, nie można go uruchomić w ISE.
źródło
[System.Console]
nie można przekierować do pliku.Oszukiwałem, ale uważam, że to jedyna odpowiedź, która spełnia wszystkie wymagania. Mianowicie, pozwala to uniknąć końcowego CRLF, zapewnia miejsce na zakończenie innej operacji w międzyczasie i odpowiednio przekierowuje na standardowe wyjście, jeśli jest to konieczne.
źródło
źródło
żądane o / p: Włączanie funkcji XYZ ...... Gotowe
możesz użyć poniższego polecenia
$ a = "Włączanie funkcji XYZ"
Wyjście do zapisu "$ a ...... Gotowe"
musisz dodać zmienną i instrukcję w cudzysłowie. mam nadzieję, że to jest pomocne :)
Dzięki Techiegal
źródło
Jest tu już tyle odpowiedzi, że nikt tutaj nie przewinie. W każdym razie istnieje również rozwiązanie umożliwiające pisanie tekstu bez nowej linii na końcu, z następującymi elementami:
Plik wyjściowy z kodowaniem:
Wyjście Consol:
źródło
Możesz to zrobić absolutnie. Write-Output ma flagę o nazwie „ NoEnumerate ”, która jest zasadniczo tym samym.
źródło