Just nu i M3-nätverket
Gå till innehåll
Benny C

If-sats till batchfil

Rekommendera Poster

Postad (redigerade)

Kort bakgrund. Jag har ett batchscript där användaren kan välja bland att köra massa verktyg. Ett av dom är att automatiskt köra windows update under ett x antal uppstarter av datorn. Jag har själv suttit och programmerat php, html, mysql osv men det är ju inte samma språk och hur man skriver if satserna skiljer sig rejält. Har googlat men inte kommit fram till nån lösning på mitt problem som är följande:

 

Jag kan inte få till en fungerande if-sats för kontroll om datorn har startat om det antal gånger som användaren angett i batchfilen. Hjälp! Jag blir tokig snart.

Har 2 variabler som skrivs till 2 olika filer. En av variablerna skriver användaren in själv (antalet omstarter som användaren vill att windows update ska köras direkt vid start). Den andra variabeln ökas genom att scriptet körs vid uppstart och adderar +1

 

Den fungerande koden för räknaren ser ut som följande.

 

@ECHO OFF

IF EXIST %userprofile%\Downloads\restarts.txt GOTO Start
ECHO At how many logins do you want windows update to run immidiatly at startup?:
SET /p RESTARTS=""
>%userprofile%\Downloads\restarts.txt echo %RESTARTS%
SET /a Counter=0
>%userprofile%\Downloads\count.txt echo %Counter%
ATTRIB +R +H %userprofile%\Downloads\restarts.txt

:Start

CLS
SET /p CurrentCount=<%userprofile%\Downloads\count.txt
SET /a NewCount=%CurrentCount%+1
ECHO Counting at %NewCount%
ATTRIB -R -H %userprofile%\Downloads\count.txt
>%userprofile%\Downloads\count.txt echo %newcount%
ATTRIB +R +H %userprofile%\Downloads\count.txt
PAUSE
:End
EXIT

men jag skulle vilja ha en if-sats som kontrollerar och jämför filerna med varandra.

 

Scriptet är inte färdigt ännu. Det ska adderas kod för att automatiskt ta bort de skapade textfilerna (Varifrån variablerna läses). Men det borde vara möjligt att skapa en ifsats som gör att kodrader inte körs om datorn har startat om 5/5 gånger. Det är detta jag inte får till. Följande har jag provat utan lycka.

 

IF "%CO%" LEQ "%RE%" (
CLS
SET /p CurrentCount=<%userprofile%\Downloads\count.txt
SET /a NewCount=%CurrentCount%+1
ECHO Counting at %NewCount%
ATTRIB -R -H %userprofile%\Downloads\count.txt
>%userprofile%\Downloads\count.txt echo %newcount%
ATTRIB +R +H %userprofile%\Downloads\count.txt
PAUSE
)

Vad jag är ute efter är att detta kodavsnitt ska hoppas över ifall %CO% är lika med eller större än %RE%

Istället ska en annan if-sats köras (som jag ej skrivit ännu), som tar bort textfilerna samt batchfilen som ligger i autostart.

 

Hur skriver man if-satsen korrekt för att den ska kunna hämta variablerna ur textfilerna och jämföra dessa? Bra att veta: Det är endast 1 siffra i textfilerna.

Redigerad av Benny C

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Postad (redigerade)

Om man kan engelska, så är Ruby ett perfekt skriptspråk. Går bra å skripta i windows med. Installera och se till att ruby är med i PATH. Sedan är det bara att i cmd.exe ruby myscript.rb

 

Doc => https://ruby-doc.org/core-2.5.3/

 

exempel

downloads_path = File.expand_path('~/Downloads')
file_in_downloads_path = File.join(downloads_path, 'some_text.txt')

if File.exists? file_in_downloads_path
	file_content = File.readlines(file_in_downloads_path)
	puts file_content
else
	puts "Wrting to #{file_in_downloads_path}"
	File.write(file_in_downloads_path, 'Some content')
end

Kernel.exec('calc')

 

Redigerad av Phenomen

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
1 minut sedan, skrev Phenomen:

Om man kan engelska, så är Ruby ett perfekt skriptspråk. 

 

Doc => https://ruby-doc.org/core-2.5.3/

 

exempel


downloads_path = File.expand_path('~/Downloads')
file_in_downloads_path = File.join(downloads_path, 'some_text3.txt')

if File.exists? file_in_downloads_path
	file_content = File.readlines(file_in_downloads_path).first.chomp
	puts file_content
else
	puts "Wrting to #{file_in_downloads_path}"
	File.write(file_in_downloads_path, 'Some content')
end

Kernel.exec('calc')

 

Jag vet inte riktigt hur jag ska bli hjälpt av det? Inget du kan köra i cmd eller powershell eller hur?

 

jag har ett program på 20-30+ batchfiler, så jag tänker inte börja göra om allt helt plötsligt. Måste hitta en lösning som går att använda i cmd.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Just nu, skrev Phenomen:

Man kan exekvera ruby scripts från båda cmd.EXE och powershell.jagvetintevad..

Man lär sig nåt nytt varje dag 👍. Då ska jag kika närmare på det där. Tack.

 

Har du koll på varför inte if-satsen i koden jag skrev fungerar? Trodde först att det var så att variabeln blev en string och inte en integer, men då det går att addera +1 enligt mitt script så borde variabeln vara en int.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
10 timmar sedan, skrev Benny C:

Man lär sig nåt nytt varje dag 👍. Då ska jag kika närmare på det där. Tack.

 

Har du koll på varför inte if-satsen i koden jag skrev fungerar? Trodde först att det var så att variabeln blev en string och inte en integer, men då det går att addera +1 enligt mitt script så borde variabeln vara en int.

Kan det vara så att du satt citationstecken kring dina variabler i if-satsen och det gör att den blir fundersam på hur jämförelsen ska ske? Vad händer om du tar bort citationstecknen?

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Jag har nu löst problemet.

 

Man får, i början av koden, använda sig av 

setlocal enableextensions enabledelayedexpansion

Då variabler ej går att ändra med SET inom en IF Sats (och kanske en FOR & DO loop?) utan att göra vissa förändringar.

% tecken på variabler behövs bytas ut mot ! likt exemplet nedan.

 

if %CO% LSS %RE% (
!windir!\explorer.exe ms-settings:windowsupdate-action
CLS
SET /p CurrentCount=<"!USERPROFILE!\AppData\Local\Temp\count.txt"
SET /a NewCount=!CurrentCount!+1
echo !CurrentCount!
echo !Newcount!
ATTRIB -R "!USERPROFILE!\AppData\Local\Temp\count.txt"
>"!USERPROFILE!\AppData\Local\Temp\count.txt" echo !newcount!
ATTRIB +R "!USERPROFILE!\AppData\Local\Temp\count.txt"
goto End)

Om man använder %NewCount% till exempel så körs inte scriptet och avslutas oväntat utan att gå vidare.

 

Avslutningsvis sätter man följande längst ner i koden

 

endlocal

 

 

Fick allting att fungera så scriptet i sin helhet ber användaren att specificera vid hur många uppstarter som windows update ska köras direkt vid inloggning, variabeln sparas i en fil. Batchfilen kopieras till autostart, Användaren startar om datorn, batchfilen startas och kör en ifsats som kontrollerar om datorn startat om X antal gånger som användaren angett. Annars så körs windows update tills villkoret uppfylls. Temporära textfiler raderas och batchfilen i autostart raderar sig själv.  Testkörde igår och nu fungerar scriptet fullt ut.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×