Forum: PC Hard- und Software Pipes in Windows | Datei simulieren


von Egal (Gast)


Lesenswert?

Ist es möglich, einem Programm, das einen Dateinamen als Argument 
erwartet, eine ge-pipe-de Ausgabe eines anderen Programmes 
unterzujubeln?

programm1 | programm2 falsche.datei ausgabe.datei

von yalu (Gast)


Lesenswert?

In Unix/Linux geht das mit so genannten named pipes. Diese liegen wie
Dateien im Filesystem und können wie Dateien geschrieben und gelesen
werden. Auch in Windows gibt es etwas, was den Namen named Pipe trägt:

  http://msdn.microsoft.com/en-us/library/aa365590.aspx

Ob man damit das von dir Gewünschte realisieren kann, geht aus dem
Artikel leider nicht hervor. Die Beispiele sind alle so beschaffen, dass
sowohl Datenquelle als auch Datensenke speziell für die Pipe-Kommuni-
kation programmiert werden, was in deinem Fall natürlich nicht möglich
ist. Aber du kannst ja mal nach dem Begriff googeln, vielleicht gibt es
anderswo eine klarere Aussage, was mit diesen Pipes möglich ist und was
nicht.

Wenn du Pech hast, sind die named Piped eines dieser häufig anzutreffen-
den Windows-Features, bei denen Microsoft den Namen zwar zu 100%, die
Funktionalität aber nur zu 20% von anderen Betriebssystemen übernommen
hat.

Vielleicht gibt die neue PowerShell von Microsoft auch etwas mehr her.
Zitat aus Wikipedia:

  "Die auf dem .NET-Framework in der Version 2.0 basierende Windows
  PowerShell verbindet die aus Unix-Shells bekannte Philosophie von
  Pipes und Filtern mit dem Paradigma der objektorientierten
  Programmierung."

Die PowerShell kann, auch für XP, kostenlos heruntergeladen werden.

Nur so am Rande: Unter Linux/Bash gibt auch noch das Konzept der
Process Substitution, bei dem die Named Pipe nicht explizit angelegt
werden muss und die beiden Programme zusammen in einer Eingabezeile
gestartert werden können. Für dein Beispiel würde man einfach

  programm2 <(programm1) ausgabe.datei

schreiben. <(programm1) legt dabei automatisch eine temporäre named Pipe
an, startet programm1 und lenkt dessen Ausgabe in die Pipe um. Die Pipe
wird als erstes Argument dem programm2 übergeben, so dass dieses die
Ausgabe von programm1 lesen kann.

von Uhu U. (uhu)


Lesenswert?

PowerShell ist akademisches Spielzeug. Unpraktischer Mist, paßt sich 
nahtlos in die Windows-Shellseuche ein...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ist es möglich, einem Programm, das einen Dateinamen als Argument
> erwartet, eine ge-pipe-de Ausgabe eines anderen Programmes
> unterzujubeln?

Wenn die Ausgabe des anderen Programmes ein Dateiname ist, ja.

Ansonsten geht das nur, wenn das eine Programm seine Eingaben via stdin 
erwartet - das ist unter *nix auch nicht anders.

"Named Pipes" haben mit dem Pipesymbol des Kommandozeilenprozessors 
nichts zu tun, sondern sind ein Mechanismus zur 
Interprozesskommunikation auch im Netzwerk.

Sockets gegenüber haben "named pipes" den Vorteil, daß sie auch 
paketorientiert betrieben werden können, daß also im Gegensatz zu den 
streamorientierten Sockets keine Paketseparation auf der Empfängerseite 
betrieben werden muss (was interessant ist, wenn man ein 
paketorientiertes Protokoll implementieren möchte). Damit entspricht 
--unabhängig von der Paketgröße-- eine Schreiboperation einer 
Leseoperation auf der Gegenseite.

Allerdings hat MS die simultane Nutzbarkeit von "named pipes" mit jeder 
neueren Windows-Version immer weiter reduziert; unter NT 3.51 gab es 
praktisch kein Limit, während auch unter den aktuellen Serverversionen 
"named pipes" im größeren Stile (mehr als etwa 10..20 simultane 
Verbindungen) praktisch unbenutzbar sind.

von yalu (Gast)


Lesenswert?

> PowerShell ist akademisches Spielzeug. Unpraktischer Mist

Gilt das nicht für Windows insgesamt? ;-)

Ich habe die PowerShell noch nicht ausprobiert, aber immerhin scheint
sie ein paar Features mehr zu haben als das aus DOS-Zeiten stammende
cmd.exe und ist damit eher in der Lage, Egals Problem zu lösen. Aber
wahrscheinlich geht es auch damit nicht, sonst hätte sicher schon eine
Horde von Uberwindowsfreaks diesen Thread eingerannt :)

von Arc N. (arc)


Lesenswert?

Egal wrote:
> Ist es möglich, einem Programm, das einen Dateinamen als Argument
> erwartet, eine ge-pipe-de Ausgabe eines anderen Programmes
> unterzujubeln?
>
> programm1 | programm2 falsche.datei ausgabe.datei

Ja, wenn programm1 die Ausgabe von programm2 benutzen soll braucht das 
ganze nur umgedreht zu werden
programm2 falsche.datei ausgabe.datei | programm1

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.