135335
Goto Top

Batch Skript ins Powershell

Hallo erstmal
Ich habe ein Batch Skript, was mit bestimmten Wörtern in der LETZTEN Logdatei des gewünschten Dateipfads sucht.
Es ist für mich eine Fehlersucheskript, wenn Fehler, soll es nochmal überprüft werden ob dieser noch immer vorhanden ist, sonst soll das Programm oder PC neugestartet werden.

Aufjedenfall habe ich das problem, dass ich das Batch Skript in der Powershell ausführen möchte, da ein kollege alles auf Powershell ausführt und wir uns darauf geeinigt haben.
Aber da ich mich hauptsächlich nur mit CMD beschäftigt habe, benötige ich etwas hilfe.
Das Skript soll neu geschrieben werden!

Ich brauche hauptsächlich mit den for /f befehlen hilfe
Und mit findstr sollte es eigendlich mit Get-ChildItem funktionieren

Um die folgenden Skripte geht es die ich für Powershell umschreiben möchte

:run2ME
timeout 10
for /F "tokens=*" %%f in ('dir /od /b "D:\Test\*.txt"') do set _lastFile=%%f  
for /f %%i in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines=%%i  

for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines1=%%I  
if %lines% == %lines1% (

:neustart
timeout 10

for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines2=%%I  
if %lines1% == %lines2% (

:shutdown
for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines2=%%I  
if %lines1% == %lines2% (

:nex1
findstr /I /C:"failed GPU" "D:\Test\%_lastFile%"   
if %ERRORLEVEL% == 0 (
    echo %date% %time% Failed GPU string found> "D:\Test\shutdowns.txt"  
    goto :run2ME
) ELSE (
    goto :nex2
)

Zur bessere nachvollziehung hab ich den ganzen script reinkopiert

@echo off

:start
SET loopnum=0

echo Initializing...
cd "D:\Test\"   
START worker1.bat
timeout 30
goto :run
goto :run GPU

:run
timeout 15
SET /A loopnum=loopnum+1
echo Script has completed %loopnum% loops.
@echo off

for /F "tokens=*" %%f in ('dir /od /b "D:\Test\*.txt"') do set _lastFile=%%f  
echo Parsing for errors...

goto :nex0

:run2ME
timeout 10
for /F "tokens=*" %%f in ('dir /od /b "D:\Test\*.txt"') do set _lastFile=%%f  
for /f %%i in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines=%%i  

for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines1=%%I  
if %lines% == %lines1% (
    echo %date% %time% Looks like miner may have crashed, checking again ...
    goto :before neustart new check
) ELSE (
    echo All is well.
    goto :noerrors
)

:noerrors
echo No issues detected. Resume mining...
goto :run

:before neustart new check
timeout 15
for /F "tokens=*" %%f in ('dir /od /b "D:\Test\*.txt"') do set _lastFile=%%f  
for /f %%i in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines=%%i  


for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines1=%%I  
if %lines% == %lines1% (
    echo %date% %time% Looks like miner may have crashed, checking again agin...
    goto :neustart
) ELSE (
    echo All is well.
    goto :noerrors
)

:neustart
timeout 10

for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines2=%%I  
if %lines1% == %lines2% (
echo %date% %time% Miner has died of dysentery ...
    echo Loggin into shutdowns.txt - Check for details as to why the shutdown.
    echo Line count match %lines% , %lines1% , %lines2%>> "D:\Test\shutdowns.txt"  
    echo  %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%> "D:\Test\shutdowns.txt"  
    echo  %date% %time%> "D:\Test\shutdowns.txt"  
    echo Miner becomes Neustart

    taskkill /FI "WINDOWTITLE eq worker1"   

    timeout 5
    start D:\Test\worker1.bat
    timeout 30
    goto :new check
) ELSE (
    goto :noerrors
)

:new check
timeout 10
for /F "tokens=*" %%f in ('dir /od /b "D:\Test\*.txt"') do set _lastFile=%%f  
for /f %%i in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines=%%i  

for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines2=%%I  
if %lines1% == %lines2% (
    echo Miner has died of dysentery ...
    goto :shutdown
) ELSE (
    echo %date% %time% Close but all is well.
    timeout 3
    goto :noerrors
)

:before shutdown new check
for /F "tokens=*" %%f in ('dir /od /b "D:\Test\*.txt"') do set _lastFile=%%f  
for /f %%i in ('find /v /c "" ^< D:\Ethermine\%_lastFile%') do set /a lines=%%i  
timeout 10

for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines1=%%I  
if %lines% == %lines1% (
    echo %date% %time% Looks like miner may have crashed, checking again ...
    goto :shutdown
) ELSE (
    echo All is well.
    goto :noerrors
)

:shutdown
for /f %%I in ('find /v /c "" ^< D:\Test\%_lastFile%') do set /a lines2=%%I  
if %lines1% == %lines2% (
    echo %date% %time% Close but all is well.
    timeout 3
    goto :noerrors
) ELSE (
    echo %date% %time% Miner has died of dysentery ...
    echo Loggin into shutdowns.txt - Check for details as to why the shutdown.
    echo Line count match %lines% , %lines1% , %lines2%>> "D:\Test\shutdowns.txt"  
    echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%> "D:\Test\shutdowns.txt"  
    echo %date% %time%> "D:\Test\shutdowns.txt"  
    echo Shutting down now ...
    pause
    shutdown /r /t 10
)

:nex0
findstr /I /C:"CUDA error" "D:\Test\%_lastFile%"   
if %ERRORLEVEL% == 0 (
    echo %date% %time% CUDA Errors found> "D:\Test\shutdowns.txt"  
    goto :run2ME
) ELSE (
    goto :nex1
)

:nex1
findstr /I /C:"failed GPU" "D:\Test\%_lastFile%"   
if %ERRORLEVEL% == 0 (
    echo %date% %time% Failed GPU string found> "D:\Test\shutdowns.txt"  
    goto :run2ME
) ELSE (
    goto :nex2
)
:nex2
findstr /I /C:"unspecified launch failure" "D:\Test\%_lastFile%"   
if %ERRORLEVEL% == 0 (
    echo %date% %time% Unspecified Launch Failure string found> "D:\Test\shutdowns.txt"  
    goto :run2ME
) ELSE (
    goto :nex3
)
:nex3
findstr /I /C:"Thread hangs, need to restart!" "D:\Test\%_lastFile%"   
if %ERRORLEVEL% == 0 (
    echo %date% %time% Thread hangs, need to restart! string found> "D:\Ethermine\shutdowns.txt"  
    goto :run2ME
) ELSE (
    goto :nex4
)

:nex4
set Programm=TestProgramm.exe

tasklist | find /i "%Programm%"  
if %errorlevel% == 0 (
    echo Prozess "%Programm%" läuft   
    goto :noerrors
) else (
    echo %date% %time% Prozess "%Programm%" läuft nicht  
    goto :run2ME
)

Content-Key: 362669

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

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

Mitglied: 135333
135333 Jan 28, 2018 updated at 15:05:59 (UTC)
Goto Top
Hi,
Hier ist ein guter Anfang für den Einstieg
https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/04/weekend-s ...
Aufjedenfall habe ich das problem, dass ich das Batch Skript in der Powershell ausführen möchte,
Kannst du doch problemlos
Start-Process "C:\script.cmd"  
Gruß snap
Mitglied: 135335
135335 Jan 28, 2018 at 15:14:14 (UTC)
Goto Top
Sorry, habe mich vielleicht nicht ganz richtig ausgedrückt

Diese Lösungsansatz kenne ich bereits.
Ich meinte das der Code komplett im Powershell enthalten ist, gewisser maßen neu geschrieben
Mitglied: 135333
135333 Jan 28, 2018 updated at 15:25:43 (UTC)
Goto Top
gewisser maßen neu geschrieben
Darfst du gerne machen. Siehe Links im ersten Link. Grundlagen aneignen und dann bei expliziten Fragen wieder kommen.
Oder ist das hier Auftragsarbeit?! Dann mach ich dir das gerne gegen Aufwandsentschädigung.
Aber so einfach Skript hinrotzen und sagen macht mal finde ich gelinde gesagt frech, zumal ihr damit ja anscheinend auch Kohle scheffelt.
Mitglied: 135335
135335 Jan 28, 2018 at 15:41:34 (UTC)
Goto Top
Ich hab diese schon duzentmale angesehen. Geholfen hat es mir ja aber nicht für dieses
Dann Auftragsarbeit: Ja, kann ja was entbeeren aber ich benötige es auch nur für zu Hause und wird nicht in einer Firma oder Schule oder wo auch immer verwendet
Ist für mich zu Hause
Mitglied: 135333
Solution 135333 Jan 28, 2018 updated at 16:57:34 (UTC)
Goto Top
Zitat von @135335:

Ich hab diese schon duzentmale angesehen. Geholfen hat es mir ja aber nicht für dieses
Ansehen ist gut, praktizieren und üben noch besser. Ein Meister fällt nicht vom Himmel.
Ist für mich zu Hause
Aha.

Miner has died of dysentery ...
und
:run GPU
Trotzdem machst du damit anscheinend Kohle auf Kosten der Umwelt sollten wir das unterstützen?? Ich glaub besser nicht face-sad.

Meine Tipps für dich zum lernen, schau dir folgende CMDLets an
Get-Content = "Damit bekommst du den Inhalt von Dateien"
Compare-Object = "Damit kannst du Dateiinhalte vergleichen"
Get-ChildItem = Damit holst du dir die aktuellste Datei eines Ordners"
Sort-Item = "Sortiert die Dateiliste nach einer Eigenschaft"
Folgendes gibt dir z.B. die aktuellste Textdatei eines Ordners aus.
get-childitem D:\Ordner\*.txt | sort LastWriteTime -Descending | select -First 1
sleep 10 = "Damit pausierst du ein Skript"

Damit solltest du beginnen. Glaub mir wenn du es selber schaffst bringt dir das mehr und du hast auch noch was für die Zukunft gelernt.

Gruß und hör auf mit der nutzlosen Energievergeudung.
snap
Mitglied: 135335
135335 Jan 28, 2018 at 17:07:38 (UTC)
Goto Top
Super, danke
Dann bleibt mir nur noch eine Frage
Warum funktioniert das nicht mit ForEach?
Mitglied: 135333
135333 Jan 28, 2018 updated at 17:14:06 (UTC)
Goto Top
Zitat von @135335:
Dann bleibt mir nur noch eine Frage
Warum funktioniert das nicht mit ForEach?
Das brauchst du für diesen Zweck in Powershell nicht mehr, das ist nur in Batch ein Workaround um an die letzte Zeile der Datei zu kommen. Da gibt es mit Powershell viel bessere Methoden wie das geschriebene Compare-Object oder auch Get-Content mit dem Parameter -tail mit dem sich solche Abfragen im Handumdehen abwickeln lassen.
Powershell braucht solche abstrusen Konstrukte mit der For-Schleife für deinen geschilderten Zweck nicht mehr!

Also ein 1zu1 umsetzen mit gleichen Kontrukten wie in Batch, davon solltest du dich verabschieden, denn Powershell ist eine mächtige Programmier/Skript-Sprache. Damit lässt sich vieles wesentlich effektiver abwickeln.
Mitglied: 135335
135335 Jan 28, 2018 at 17:14:09 (UTC)
Goto Top
Ok
Nochmals Danke
Mitglied: 135333
135333 Jan 28, 2018 updated at 18:32:44 (UTC)
Goto Top
Kein Thema. face-smile