ff-itler
Goto Top

Ausgabe aus cmd anpassen und in eine txt speichern

Hi,

ich versuche momentan eine batch zu schreiben, welche mir die Ausgabe von Get-Service als Format Status|Name|DisplayName in eine .txt schreibt. Hat jemand eine Idee wie das umsetzen kann?

Bei Get-Service

Status Name DisplayName
------------ ----------------------
Running Dhcp DHCP Cient
Stopped EFS Encrypting File System <EFS>
..... ........

Und die .txt soll so aussehen

running|Dhcp|DHCP Cient
Stopped|EFS|Encrypting File System <EFS>
|.....|........

Content-Key: 384233

Url: https://administrator.de/contentid/384233

Printed on: April 25, 2024 at 15:04 o'clock

Member: manuel-r
manuel-r Aug 23, 2018 at 17:14:13 (UTC)
Goto Top
Muss ich das verstehen?
Warum willst du die Ausgabe eines PS-Cmdlets mit einer Batch parsen und umformatieren, wenn du das mit der Powershell selbst viel einfacher haben kannst?

Manuel
Member: Kraemer
Kraemer Aug 23, 2018 at 18:15:43 (UTC)
Goto Top
Das get-service per Pipe an Export-csv weiterreichen und den Delimiter entsprechend setzen. Fertig
Member: Penny.Cilin
Penny.Cilin Aug 23, 2018 at 18:24:44 (UTC)
Goto Top
Weil PS-Cmdlets auch irgenwie mit Batches zu tun haben, oder in Batches verwendet werden können?
Und das was er haben will, ist ein PowerShell Skript, welches ihm die gewünschte Ausgabe liefert.

Und ein PowerShell Skript ist nun mal ein Batch (Stapelverarbeitungsdatei).

@ff-itler
Sorry ich bin jetzt nicht so der PowerShell Spezialist. Wenn ich es richtig verstehe, willst Du die Standardausgabe des cmdlets Get-Service als TXT-Datei ausgeben. verstehe ich das richtig?

@colinardo: Kannst Du bitte uns bzw. ff-itler hier unterstützen?

Gruss Penny
Member: rubberman
rubberman Aug 23, 2018 updated at 22:19:01 (UTC)
Goto Top
*.bat
@echo off &setlocal
set "file=services.txt"  
powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-Service | Select-Object Status,Name,DisplayName | ConvertTo-Csv -Delimiter '|' -NoTypeInformation | %%{$_.Replace('\"','')} ^| Out-File \"%file%\""  

Zitat von @Penny.Cilin:
Und ein PowerShell Skript ist nun mal ein Batch (Stapelverarbeitungsdatei).
Nein.

Grüße
Steffen
Member: ff-itler
ff-itler Aug 24, 2018 at 06:24:34 (UTC)
Goto Top
@manuel-r
Weil ich die .txt in Java später einlesen möchte und dieses Format für mich einfacher ist.

@Penny.Cilin
Ja genau sowie es rubberman gemacht hat face-smile

Wisst ihr vielleicht auch wie ich diesen von meinem lokalen Computer auf einer vm ausführe. Bisher hatte ich es mit wmic /node:"servername" /user:"Nutzer" /password:"password" <Hier der Befehl von rubberman> versucht.
Member: Penny.Cilin
Penny.Cilin Aug 24, 2018 at 08:03:03 (UTC)
Goto Top
Zitat von @rubberman:

*.bat
Das stimmt nicht ganz. *.bat ist eine Dateiendung für Stapelverarbeitungsdateien. Unter Windows gibt es auch seit Windows NT *.cmd als Batchdatei.
Bei Mainframes werden zum Beispiel JCL Dateien oder REXX Dateien als Batches ausgeführt, da in diesen Dateien Befehle (JCL oder REXX) stapelweise ausgeführt werden.
@echo off &setlocal
> set "file=services.txt"  
> powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-Service | Select-Object Status,Name,DisplayName | ConvertTo-Csv -Delimiter '|' -NoTypeInformation | %%{$_.Replace('\"','')} ^| Out-File \"%file%\""  
> 

Zitat von @Penny.Cilin:
Und ein PowerShell Skript ist nun mal ein Batch (Stapelverarbeitungsdatei).
Nein.
Doch denn auch ein Powershellskript ist eine Stapelverarbeitungsdatei. Wenn mehrere Befehle in eine *.ps Datei gespeichert werden, dann werden diese stapelweise abgearbeitet. Das gilt auch für andere Skriptsprachen.

Grüße
Steffen

Gruss Penny
Member: colinardo
colinardo Aug 24, 2018 updated at 09:25:31 (UTC)
Goto Top
Zitat von @ff-itler:
Wisst ihr vielleicht auch wie ich diesen von meinem lokalen Computer auf einer vm ausführe. Bisher hatte ich es mit wmic /node:"servername" /user:"Nutzer" /password:"password" <Hier der Befehl von rubberman> versucht.
No Problem:
@echo off
set "computer=XYZ"  
set "file=services.txt"  
powershell -ExecutionPolicy ByPass -NoProfile -Command "(gwmi win32_Service -ComputerName '%computer%' | select State,Name,DisplayName | convertto-csv -NoType -Delimiter '|') -replace '\"','' | set-content '%file%'"  

Zitat von @Penny.Cilin:
@colinardo: Kannst Du bitte uns bzw. ff-itler hier unterstützen?
Wieso? Dazu solltet Ihr doch eigentlich inzwischen bei so einer Pippifax-Aufgabe für Azubis im ersten Lehrjahr auch in der Lage sein. face-smile, genug Input für diese Basics habe ich hier ja über die letzten Jahre immer wieder geliefert.

Grüße Uwe
Member: ff-itler
ff-itler Aug 24, 2018 at 08:32:29 (UTC)
Goto Top
@colinardo

Danke für deine Antwort leider hab ich es denke ich etwas falsch herum formuliert.

Das Skript von dir würde doch auf einem WindowsServer laufen und gibt mir die Infos eines anderen Computers.

Was ich bräuchte ist ein Skript was von Windows 10 per Remote Verbindung auf die vm zugreift, die Informationen holt und diese auf meinem Windows 10 Computer ablegt als .txt.

Diese txt lese ich mit Java ein und soll flexibel für mehrere VMs nacheinander anwendbar sein.
Member: colinardo
colinardo Aug 24, 2018 updated at 08:43:49 (UTC)
Goto Top
Zitat von @ff-itler:
Das Skript von dir würde doch auf einem WindowsServer laufen und gibt mir die Infos eines anderen Computers.
Jepp, aber auch einer VM solange sie per Netzwerk vom Host erreichbar ist.
Was ich bräuchte ist ein Skript was von Windows 10 per Remote Verbindung auf die vm zugreift, die Informationen holt und diese auf meinem Windows 10 Computer ablegt als .txt.
Macht das ja (s. Parameter -Computername) du musst nur den Computernamen der VM angeben und sicherstellen das die Firewalls entsprechend konf. sind und bei anderen Credentials entweder noch die Credentials per -Credential Parameter mitgeben oder Skript im anderen Kontext laufen lassen .

Diese txt lese ich mit Java ein und soll flexibel für mehrere VMs nacheinander anwendbar sein.
Würde ich an deiner Stelle direkt mit Java machen, das hat bereits alles an Bord um sowas zu machen als so ein Mischmasch aus Batch Powershell und Java zu fabrizieren!
Member: ff-itler
ff-itler Aug 24, 2018 at 09:18:15 (UTC)
Goto Top
Die .bat hatte ich meinem Rechner ausgeführt und erhielt diesen Fehler

PS C:\....\....\....> .\test.bat

Fehler: Unbekannter Befehl

BESCHREIBUNG:
        SC ist ein Befehlszeilenprogramm für die Kommunikation mit dem
        Dienststeuerungs-Manager und mit Diensten.
SYNTAX:
        sc <Server> [Befehl] [Dienstname] <Option1> <Option2>...

Bei Java habe ich die cmd oder bat jeweils so aufgerufen
// Ausführen eines externen Commands
Process myProcess = Runtime.getRuntime().exec(new String { "funktion.cmd", variable1,  
								variable2, variable3,variable4 });
myProcess.waitFor();
Member: colinardo
colinardo Aug 24, 2018 updated at 11:24:54 (UTC)
Goto Top
Dann läuft bei dir noch eine alte Powershell die den Alias sc für Set-Content nicht kennt, habe ich oben für dich jetzt oben im Code nochmal ausgeschrieben ...
PS C:\....\....\....> .\test.bat
Eine *.Bat mit PS Code in der PS Konsole ausführen, wat für'n Blödsinn mal ehrlich face-big-smile.
Bei Java habe ich die cmd oder bat jeweils so aufgerufen
Du solltest dich mal in Remote-WMI Abfragen per Java schlau machen dann brauchst du diesen Schmuh nicht face-smile.
https://nikunjp.wordpress.com/2011/06/11/wmi-with-java-using-j-interop/
Member: rubberman
rubberman Aug 24, 2018 at 11:20:36 (UTC)
Goto Top
[OT]
Hallo Penny

Zitat von @Penny.Cilin:
Das stimmt nicht ganz. *.bat ist eine Dateiendung für Stapelverarbeitungsdateien. Unter Windows gibt es auch seit Windows NT *.cmd als Batchdatei.
Die Dateiendung *.cmd hat sich nie wirklich durchgesetzt, ist aber auch egal. Die Unterschiede sind marginal und in beiden Fällen ist cmd.exe der Interpreter. Der Grund warum *.bat Dateien als Batchdateien bezeichnet werden hat historische Gründe die in die Zeiten von DOS zurückreichen, aber ich will hier keine Off-Topic-Romane schreiben...

Doch denn auch ein Powershellskript ist eine Stapelverarbeitungsdatei. Wenn mehrere Befehle in eine *.ps Datei gespeichert werden, dann werden diese stapelweise abgearbeitet. Das gilt auch für andere Skriptsprachen.
Ich weiß worauf du hinaus willst. Bei allen Sprachen ist es so, dass entweder der gesamte Code oder Teile (Prozeduren) jeweils chronologisch von oben nach unten abgearbeitet werden. Den Begriff Batch oder Stapelverarbeitung dahingehend so weit aufzumachen, halte ich aber für falsch. Dann gibt es keine Abgrenzung mehr. Bei Powershell spricht allein das Paradigma schon dagegen (objektorientiert). Noch deutlicher wird es aber bei der Syntax. Es wird eher horizontal als vertikal abgearbeitet, da die Syntax von Powershell es erlaubt, selbst Objekte per Pipeline von Cmdlet zu Cmdlet weiter zu geben.

Jetzt höre ich aber auch auf. Zum eigentlichen Thema trägt das nichts bei face-wink

Gruss Penny
Grüße
Steffen
[/OT]
Member: Penny.Cilin
Penny.Cilin Aug 24, 2018 at 13:03:02 (UTC)
Goto Top
[OT]
@rubberman
Der Grund warum *.bat Dateien als Batchdateien bezeichnet werden hat historische Gründe die in die Zeiten von DOS zurückreichen, aber ich will hier keine Off-Topic-Romane schreiben...
Ja die Historie aus DOS Zeiten kenne ich zur Genüge.

In Zeiten Multiprocessing und Cores ist diese Unterscheidung nicht mehr so einfach das stimmt. Trotzdem denke ich das meine Meinung nicht ganz verkehrt ist, denn die Befehle werden stapelweise wie Du geschrieben hast
horizontal als vertikal abgearbeitet
Das gilt auch für andere Skript- oder Hochsprachen wie Perl, REXX, VisualBasic, Cobol, Fortran ja auch für Smalltalk.
[/OT]

Gruss Penny
Member: Kraemer
Kraemer Aug 24, 2018 at 14:09:35 (UTC)
Goto Top
[OT]
Zitat von @Penny.Cilin:
Trotzdem denke ich das meine Meinung nicht ganz verkehrt ist, denn die Befehle werden stapelweise...
Ich denke nicht, dass du da richtig liegst. Mit Powershell kannst du auch Ereignisorientiert unterwegs sein face-smile