webForumDet fria alternativet

visa output från DOS

.NET

21 svar · 513 visningar · startad av Nexus86

Medlem sedan okt. 20023 030 inlägg
Frågan#1

Om man startar ett dosfönster/kommandofönster med antingen Shell eller en API, finns det något sätt att kolla vad fönstret skriver ut utan en tempfil? D.v.s utan Shell("Mittprogram > tempfil")?

Medlem sedan juni 20022 599 inlägg
#2

Jag inbillar mig att man isåf blir tvungen att dra igång ett skal och sen redirecta STDOUT till en pipe som man läser ifrån.

Vad du borde göra är att snoka upp lite kod till tex en Telnet-server. Den gör ju just såna saker som att köra DOS-kommandon läsa av outputen och sen skicka tillbaks denna till en nätverksklient.

Här är lite kod från Windowsversionen av rlogind. Jag kan inte påstå att jag förstår den själv men den kanske ger lite idéer om vilka API:er det handlar om?

http://member.webforum.nu/3773/doexec.txt

Men annars kan jag ha fel. Det kan finnas nåt mycket enklare?

Medlem sedan okt. 20023 030 inlägg
#3

Pga att mina C/C++-kunskaper inte är vidare kraftiga skulle det ta något år eller två att först skriva om till VB för att få en bättre överblick och sedan några dagar till för att förstå vad denna kod gör. :) Måste ju finnas något annat.

Medlem sedan juni 20022 599 inlägg
#4

Nexus86 skrev:

Måste ju finnas något annat.

Har du inte lärt dig programmeringens första regel:

"Allt som verkar lätt är svårt och allt som verkar svårt är lätt."? :OO

Men iaf så lyckades jag snoka upp att Windows Scripting Host verkar ha bättre möjlighet att fånga upp andra processers STDIN och STDOUT än VB själv.

Till exempel så funkar detta rätt bra att köra i VB:

    Dim WshShell As Object, oExec As Object, sSTDOUT As String
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("cmd /C dir c:")
    Do While True
     If Not oExec.StdOut.AtEndOfStream Then
       sSTDOUT = sSTDOUT & oExec.StdOut.Read(1)
     Else
        Exit Do
     End If
    Loop
    Debug.Print sSTDOUT

Källa:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wslrfstdoutproperty.asp

Medlem sedan okt. 20023 030 inlägg
#5

Man tackar! :bire

Medlem sedan okt. 20023 030 inlägg
#6

Är det det att det är VBScript egentligen eller är det något annat som gör att jag får fel på följande rad?

Set oExec = WshShell.Exec("cmd /C dir c:")

Felet lyder "Object does not support this property or method.". Hur göra?

EDIT // Efter en snabb titt i classen ser jag att följande är de enda funktioner, subbar resp. egenskaper som finns:

  • AppActivate (Funktion)
  • CreateShortcut (Funktion)
  • Environment (Egenskap)
  • ExpandEnvironmentStrings (Funktion)
  • LogEvent (Funktion)
  • Popup (Funktion)
  • RegDelete (Sub)
  • RegRead (Funktion)
  • RegWrite (Sub)
  • Run (Funktion)
  • SendKeys (Sub)
  • SpecialFolders (Egenskap)

Mao finns inte Exec. Behöver man en ny version av Windows Script Host eller?

Medlem sedan juni 20022 599 inlägg
#7

Hmm .. Kan bara tänka mig att du har en för gammal version av Windows Script Host?

Om du lägger till en referens till Windows Script Host Object Model så ska du kunna köra typat:

    Dim WshShell As WshShell, oExec As WshExec, sSTDOUT As String
    Set WshShell = New WshShell
    Set oExec = WshShell.Exec("cmd /C dir")
    Do While True
     If Not oExec.StdOut.AtEndOfStream Then
       sSTDOUT = sSTDOUT & oExec.StdOut.Read(1)
     Else
        Exit Do
     End If
    Loop
    debug.Print sSTDOUT

och få upp alla tillgängliga metoder i intellisensen.

WSH 5.6: http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp

Medlem sedan okt. 20023 030 inlägg
#8

Jag skrev:

Behöver man en ny version av Windows Script Host eller?

niko skrev:

Kan bara tänka mig att du har en för gammal version av Windows Script Host?

Vi tänker förmodligen lika. :e Ska starta om nu får vi se om det fungerar sen.

Medlem sedan okt. 20023 030 inlägg
#9

Nu fungerar det alldeles utmärkt! Tackar! En fråga till bara, finns det något sätt att få texten att visa ett ä istället för "„" när det egentligen är ett ä och ett å istället för "†" när det egentligen är ett å och alla andra tecken utan att behöva använda replace?

Medlem sedan okt. 20023 030 inlägg
#10

Blev en fråga till :), går det att köra fönstren utan att de syns?

Medlem sedan juni 20022 599 inlägg
#11

Man kan använda API:et OemToChar för att hantera skillnaderna i Code Pages mellan DOS och Windows:

	Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
	(ByVal lpszSrc As String, ByVal lpszDst As String) As Long

    	Dim WshShell As WshShell, oExec As WshExec, sSTDOUT As String
    	' osv
	[b]OemToChar sSTDOUT, sSTDOUT[/b]
    	debug.Print sSTDOUT

Motsatsen heter: CharToOem (surprise!)

går det att köra fönstren utan att de syns

Tror, inte det, tyvärr. Då får du nog dyka ner i C-koden däruppe.

Medlem sedan okt. 20023 030 inlägg
#12

Ok. Tack iaf! :bire

Om någon kommer på något annat sätt så man fortfarande kan gömma fönstret så skriv gärna. Håller nämligen på med en webbserver och bygger in stöd för php och vill inte att php.exe ska starta synligt hela tiden.

Medlem sedan juni 20022 599 inlägg
#13

En reflexion: Om det är en webbserver du skriver så antar jag att du så småningom tänker köra den som en NT-Service? Och om du gör det så kommer problemet att lösa sig själv eftersom services normalt inte "syns" när de exekverar.

Medlem sedan okt. 20023 030 inlägg
#14

En annan tanke: Bara för att det körs som en service så betyder det inte att andra program som startas av servicen också är dolda. :)

r/ Kom just på att det kanske går om man på något sätt kan starta ett annat program inuti sitt eget som en ny thread (tråd? :q). Eller om man kan använda sig av php4ts.dll som används av både webbservermoduler och php.exe. :) Dags att börja studera om det går. Hittar du något bra så tipsa gärna!

Medlem sedan juni 20022 599 inlägg
#15

Nexus86 skrev:

Bara för att det körs som en service så betyder det inte att andra program som startas av servicen också är dolda

Eh, jo? Om en service är satt att inte få "Interact with desktop" så ärver som default alla processer den startar samma egenskap.

Nexus86 skrev:

Kom just på att det kanske går om man på något sätt kan starta ett annat program inuti sitt eget som en ny thread

Vet inte riktigt. Att konsolen kör i en egen tråd lär inte göra den osynlig. I övrigt har jag ingen direkt koll på PHP-grejer, tyvärr.

Medlem sedan okt. 20023 030 inlägg
#16

OK! Så alla program som startas av min service kommer vara dolda då? Tack! Du har vart till stor hjälp. :bire

Medlem sedan juni 20022 599 inlägg
#17

OK! Så alla program som startas av min service kommer vara dolda då?

Ja, så vitt jag vet. Processer som startas via WshShell.Exec kommer iaf inte att ha en synlig konsol. (Testade precis.)

Medlem sedan okt. 20023 030 inlägg
#18

Så bra! Tack så mycket!

Medlem sedan okt. 20023 030 inlägg
#19

Hittade en kod som fungerar utmärkt och gömmer fönstret även om man inte har programmet som en service. :i Bifogar klassmodulen till detta.

r/ Bifogar som zip istället i nästa meddelande då man inte får ladda upp en ny fil vid redigering och fler personer antagligen kan öppna zip snarare än rar. :r

Medlem sedan okt. 20023 030 inlägg
#20

Här är filen.

275 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)