goooly
Goto Top

Konvertieren eines Tools von PowerShell nach etwas, was man kompilieren kann VB, C, ..

Also, ich habe ein VirtualServer, auf dem Programme laufen und der immer hart an der RAM-Obergrenze schrammt. Ich habe nun ein kl. PowerShell Script geschrieben, dass das Laufen der Programme überwacht und, falls abgestürzt, sie wieder startet. Allein, die PowerShell frißt knapp 100MB meines Rams und deren Scripte kann man nicht kompilieren - also möchte ich das Script in 'was anderes übertragen und kompilieren und ich denke vielleicht gibt es hier neben Interesse auch Hilfe. Zu Zeit ist der Prg-Filename "terminal.exe" und die Pfade noch 'hard-coded', später soll das als Attribute übergeben werden.

So, mein Script läuft, es gibt sogar auf der Konsole eine Statusmeldung aus. Erschwerend bei meinem Problem ist der Umstand, dass dreimal dasselbe Programm gestartet wird, nur aus unterschiedlichen Foldern, es muss also der Pfad überprüft werden.
Als final denke ich mir: checkRun.exe "Filname.exe", "pfad1", "pfad 2", .... Zur Zeit ist es halt noch fest eingeschrieben.
Und es geht mir um die die Programm in VBasic, oder C, oder ... und dann kompiliert.
Hat jemand Interesse das mitzumachen? Ich denke es mir als frei für alle...
$pN      = "terminal" ## later: $args  
$orgPaths = @("C:\Program Files (x86)\FIBO Group Holdings Limited", "C:\Program Files (x86)\GFT MT4 Powered by BT", "C:\Program Files (x86)\MT4")  
$noPATH  = $orgPaths.length
$debug   = $false ## later -debug -Option


while (1) {
	$nRunning = 0
	$checkPaths = $orgPaths.Clone()
	$ProgressHeadLine = "checking MT4 Traders at "+(Get-Date)  
	$ProgressStatus = ""  
	if ( $allProcesses = get-process -name $pN -errorAction SilentlyContinue ) {

		foreach ($oneProcess in $allProcesses) {
			$idx = -1
			$prg = $oneProcess.path
			$aPR = $prg.split("\ ")  
			$txtDebug = " check:`t"+$prg+"`n"  
			$filled = " found:`t"  
			$failed = "FAILED:`t"  
			for($k=0; $k -lt $noPATH; $k++) {
				$pth   = $orgPaths[$k]

				$txtDebug += "Idx["+$k+"]:`t"+$pth+"`n"  
				if ($pth -match "^ok") { continue }  
				$aPcs  = $pth.Split("\ ") ## split into Pieces  
				$nPcs  = $aPcs.count			
				$tmp = "";  
				for( $n=0; $n -lt $nPcs; $n++ ) {
					$p = $aPcs[$n]
					if ( $aPR[$n] -match $p ) {
						$filled = $filled+" "+$p  
						if ( $n -eq 4 ) {
							$tmp += "   "+$p  
						}
						if ( $n -eq 5 ) {
							$tmp += "-"+$p  
						}
					} else {
						$failed = $failed+"#"+$p  
						break
					}
					if ( $n -eq ($nPcs - 1) ) {
						$ProgressStatus += $tmp+":ok"  
						$txtDebug += $filled+"`n"+$failed+"`n"+"ret:`t"+$k+"`n"  
						$idx  = $k
					}
				}
			}

			if ( $idx -lt 0 ) {
				$txtDebug += "NOT fnd:`t"+$oneProcess.path+"`n"  
				$ProgressStatus += " NOT FOUND  "  
			} else {
				$txtDebug += "fnd["+$idx+"]:`t"+$checkPaths[$idx]+"`n"  
				$checkPaths[$idx] = "ok"  
				$nRunning++
			}
			write-progress -activity $ProgressHeadLine -status $ProgressStatus
			## start-sleep 1
        }
	} else {
		## nothing is running start them all
		foreach ($p in $orgPaths) {
			$start = $p+"\"+$pN+".exe"  
			$txtDebug += " checkd "+(Get-Date)+" going to start "+$start+"`n"  
			## $mt4 = [System.Diagnostics.Process]::Start( $start )
		}
		continue
	}

	if ( $nRunning -eq $noPATH ) {
		$txtDebug += "check`t"+(Get-Date)+"  all "+$nRunning+" MT4 (of "+$noPATH+") are running`n"  
	} else {
		$txtDebug += "check`t"+(Get-Date)+" just "+$nRunning+" MT4 (of "+$noPATH+") are running`n"  
		for($i=0; $i -lt $noPATH; $i++) {
			if ( $checkPaths[$i] -match "^ok" ) {  
				if ( $debug -eq $true ) { echo("ok:`t"+(Get-Date)+" running  "+$orgPaths[$i]) }  
			} else {
				$start = $checkPaths[$i]+"\"+$pN+".exe"  
				$txtDebug += "##:`t"+(Get-Date)+" to start "+$start+"`n"  
				$mt4 = [System.Diagnostics.Process]::Start( $start )
			}
		}
	}

	if ( $debug -eq $true ) { $txtDebug }
	start-sleep 10
}

Content-Key: 167082

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

Printed on: April 19, 2024 at 21:04 o'clock

Member: Pjordorf
Pjordorf May 27, 2011 at 21:15:27 (UTC)
Goto Top
Hallo an dich "Also, ich habe ein...",

Zitat von @goooly:
Also, ich habe ein VirtualServer, auf dem Programme laufen und der immer hart an der RAM-Obergrenze schrammt. Ich habe nun ein kl. PowerShell Script geschrieben, dass das Laufen der Programme überwacht und, falls abgestürzt, sie wieder startet.
Warum nicht einfach mehr RAM in deine Kiste stecken? Und stürzen diese Programm wirklich wegen zu wenig RAM ab?

Gruß,
Peter
Member: goooly
goooly May 27, 2011 at 21:34:20 (UTC)
Goto Top
Warum monatlich mehr zahlen, wenn nicht nötig?
Ob sie abstürzen - weiß ich nicht, es soll aber nicht passieren, wen ich gerade nicht da bin - und meistens ist es so!
Calli
Member: TsukiSan
TsukiSan May 28, 2011 at 13:20:03 (UTC)
Goto Top
Hallo goooly,

die 100MB erschrecken mich auch bei Powershell. Habe damit noch nicht gearbeitet, aber diesen Aspekt
hätte ich nicht erwartet. Skripte sind meistens die schnellsten.

Naja, man kann das sicher auch mit Batch, VBS oder VB machen ( hier mal ein Beispiel in VB , wie man die aktuellen Fenster/Programme ermittelt im Taskmanager.). VBS und VB lassen sich kompilieren und Batch - so meine ich - auch.
Bei deiner Fragestellung würde ich fast zu Batch tendieren. Diese sollte am schnellsten und resourcensparenden sein.
Aber bitte belehrt mich da eines besseren. Ob man die dann noch in eine exe wandeln muss - ok, deine Entscheidung face-wink

Soweit erst mal,

Gruss
Tsuki

[Edit]
und hier im Vergleich zu VB das ganze als Einzeiler in Batch:
tasklist >task.txt

[/Edit]
Member: TsukiSan
TsukiSan May 28, 2011 at 13:54:09 (UTC)
Goto Top
ich nochmal:

also, wenn ich mit zum Beispiel
call "D:\Eigene Programme\MeinProgramm.exe"  
starte, werden gerade mal 1,5MB im Speicher verbraten (WinXP Pro SP3)
Das ist erst einmal ein 70stel von der Powershell!

Batch kann man nach exe mit zum Beispiel Bat_To_Exe_Converter.exe konvertieren. Auch das habe ich mal getestet und würde funktionieren.

also ich tendiere nach wie vor zu Batch, wenn es schnell sein soll und resourcensparend.
In einer Schleife laufen lassen mit ein bisschen Prozesse abfragen-ping-goto-etc. da sollte dein Vorhaben umsetzbar sein.

Viele Grüße
Tsuki
Member: goooly
goooly May 29, 2011 at 11:11:01 (UTC)
Goto Top
Danke, batch in der alten Dos cmd scheint mir interessant, aber ich habe gleich einen Dämpfer bekommen:
Wie komme ich an den File-Name der laufenden Programme?
Zwar kriege ih alle laufenden terminal.exe:
tasklist /FI "IMAGENAME eq terminal.exe"
aber dann gibt's keinen Pfad dieser terminal.exe
Bin weiter am suchen, aber wenn jemand schnel eine Idee hat?
LG, gooly