135335
Jan 28, 2018, updated at Jan 30, 2018 (UTC)
1614
9
0
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
Zur bessere nachvollziehung hab ich den ganzen script reinkopiert
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
)
Please also mark the comments that contributed to the solution of the article
Content-Key: 362669
Url: https://administrator.de/contentid/362669
Printed on: May 8, 2024 at 02:05 o'clock
9 Comments
Latest comment
Hi,
Hier ist ein guter Anfang für den Einstieg
https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/04/weekend-s ...
Gruß snap
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 problemlosStart-Process "C:\script.cmd"
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.
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.Ich hab diese schon duzentmale angesehen. Geholfen hat es mir ja aber nicht für dieses
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 .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
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
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.Dann bleibt mir nur noch eine Frage
Warum funktioniert das nicht mit ForEach?
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.
Kein Thema.