Command to copy a file every 10 min only when Firefox is open - batch-file

I would like to copy a file every 10 minutes when Firefox is open.
I am not sure what is the best way to do that but so far I have created a .bat that I wanted to link to a task in Task Scheduler that will run it every 10 minutes.
This is the command in the .bat :
copy "C:\Users\Me\Zotero\zotero.sqlite" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\zotero_%date%.sqlite"
But Task Scheduler doesn't allow me to add a condition (= run only if firefox is open) nor to run a task every 10 minutes.
So here are my questions:
If a .bat is a good way to do this, how can I run a .bat with those two parameters?
If a .bat is not a good way to do this, what method would you recommend?

You could just have a batch file like this:
#echo off
:loop
tasklist /FI "IMAGENAME eq firefox.exe" 2>NUL | find /I /N "firefox.exe">NUL
if "%ERRORLEVEL%"=="0" copy "C:\Users\Me\Zotero\zotero.sqlite" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\zotero_%date%.sqlite"
timeout /t 600 /nobreak
goto loop
This would be a standalone batch-script you would have to start yourself, or put in the startup folder.
You could also just take the
#echo off
tasklist /FI "IMAGENAME eq firefox.exe" 2>NUL | find /I /N "firefox.exe">NUL
if "%ERRORLEVEL%"=="0" copy "C:\Users\Me\Zotero\zotero.sqlite" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\zotero_%date%.sqlite"
and run that every 10 minutes from task scheduler ofcourse.
You could also make this into your firefox shorcut and end it when the program isn't active anymore, like this:
#echo off
set programName=firefox.exe
start %programName%
:loop
tasklist /FI "IMAGENAME eq %programName%" 2>NUL | find /I /N "%programName%">NUL
if "%ERRORLEVEL%"=="0" copy "C:\Users\Me\Zotero\zotero.sqlite" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\zotero_%date%.sqlite"
if "%ERRORLEVEL%"=="1" exit /b
timeout /t 600 /nobreak
goto loop

Related

Kill slow command after some time and return value

I've got a piped TASKLIST | FINDSTR command, which can take long time to finish. I don't want to wait too long for it, so I want to stop searching with FINDSTR and just get ERRORLEVEL 1 value, after for example 5s.
This script got to look if the specific EXE is running, and if it's not - open it.
#echo off
:B
set Poro=CapsuleFarmerEvolved.exe
TASKLIST /fi "imagename eq %Poro%" 2>nul | FINDSTR /i %Poro%
if ERRORLEVEL 0 (GOTO :B) else (start "" CapsuleFarmerEvolved.exe)
GOTO :B
I've tried adding timeout before the TASKLIST, but since it's piped, it doesn't work.
I was wondering maybe about creating a different .bat with this exact command and somehow kill the whole process, then return the value to the main script.
That is my first take to create a script, so please forgive me lack of basic knowlege, but I'd tried my best before posting this
This should do it, however this is still a ridiculous idea, i.e. using a never-ending script to monitor, and restart an application, when it is no longer running.
#Echo Off
Set "Poro=CapsuleFarmerEvolved.exe"
:Loop
%SystemRoot%\System32\tasklist.exe /Fi "Status Eq Running" /Fi "ImageName Eq %Poro%" 2>NUL | %SystemRoot%\System32\find.exe /I "%Poro%" 1>NUL || Start "" "P:\athTo\%Poro%"
%SystemRoot%\System32\timeout.exe /T 5 /NoBreak 1>NUL
GoTo Loop

Batch script to tell if process is running or not

I am very new to batch files and am trying to create a script that checks if a process is running and alert if the process is/is not running. This is what I have gotten from google, but isn't working the way I am wanting.
tasklist /FI "IMAGENAME eq example.exe" 2>NUL | find /I /N "example.exe">NUL if "%ERRORLEVEL%"=="0" echo Program is running
If this is batch (as the attempt from the question indicates), according to [MS.Docs]: Using multiple commands and conditional processing symbols:
&& [...]
command1 && command2
Use to run the command following && only if the command preceding the symbol is successful. Cmd.exe runs the first command, and then runs the second command only if the first command completed successfully.
Example:
C:\>(tasklist /FI "IMAGENAME eq svchost.exe" 2>NUL | findstr /I /N "svchost.exe" >NUL) && (echo Program running)
Program running
C:\>(tasklist /FI "IMAGENAME eq svchost1.exe" 2>NUL | findstr /I /N "svchost1.exe" >NUL) && (echo Program running)
You are trying to over complicate it. Copy the below into a batch file. Also use findstr instead.
tasklist /fi "imagename eq example.exe" | findstr /i "example.exe" >nul
If %errorlevel%==0 echo example.exe running.
If %errorlevel%==1 echo example.exe Not running.
This is even less complicated, there's no need to filter by ImageName when you're using Find to filter too:
TaskList|Find /I "example.exe">Nul&&(Echo Running)||Echo Not running

Copy a file only if last modify is less than 10 minutes

I currently have this batch-file that automatically backups a file every 10 minutes if firefox is open. But I would like the .bat to actually copy only if the last modified time of my file (zotero.sqlite) is less than 10 minutes:
In details
11:00 AM I run the bat, with my current code, a backup is automatically created.
I leave my desk for 30 minutes (so no modification is made to the zotero.sqlite during that time). Meanwhile, the .bat timeout will have created 3 copies of zotero.sqlite (at 11:10, 11:20 and 11:30). But I don't want those copies because they will all be identical (they will all have the same last modified date/time).
Instead I would like the .bat to be "intelligent" and notice that the files are the same (because the last modified date is the same for all) and only copy the file if the last modified date is different.
Because my simple .bat doesn't keep track of the last time it did a copy, the easiest way for it to determine if the zotero.sqlite was modified is to check the last modify date and see if it's more than 10 minutes ago :
● if yes, then the bat should not copy the zotero.sqlite and restart the 10 minutes timeout
● if the last modified date/time is less than 10 minutes ago, the bat should copy and then start the 10 minutes timeout
This will prevent me from having hundreds of identical backups accumulating.
#echo off
set programName=firefox.exe
start %programName%
:loop
tasklist /FI "IMAGENAME eq %programName%" 2>NUL | find /I /N "%programName%">NUL
if "%ERRORLEVEL%"=="0" copy "C:\Users\Me\Zotero\zotero.sqlite" "C:\Users\Me\Zotero\\Zotero_Backup_sqlite\Working_on_zotero_%date%---%time:~0,2%_%time:~3,2%_%time:~6,2%.sqlite"
if "%ERRORLEVEL%"=="1" exit /b
timeout /t 600 /nobreak
goto loop
I tried the /d command but it's giving me a syntax error.
EDIT:
this now works with regular copy so it won't prompt anymore, uses the archive attribute to check if a file has been edited, and then removes that attribute after the copy
#echo off
set programName=firefox.exe
start %programName%
:loop
tasklist /FI "IMAGENAME eq %programName%" 2>NUL | find /I /N "%programName%">NUL
if "%errorlevel%"=="0" goto copy
if "%errorlevel%"=="1" exit /b
:delayloop
timeout /t 600 /nobreak
goto loop
:copy
set "LogFile=C:\Users\Me\Zotero\zotero.sqlite"
attrib "%LogFile%" | findstr /B /L A 1>nul
if "%errorlevel%"=="1" goto delayloop
copy "%LogFile%" "C:\Users\Me\Zotero\Zotero_Backup_sqlite\Working_on_zotero_%date%---%time:~0,2%_%time:~3,2%_%time:~6,2%.sqlite"
echo File "%LogFile%" was modified since last check.
attrib -A "%LogFile%"
goto delayloop

Make a .batch file to start/stop a program?

I need a batch (.bat) file that opens a program if it's not open, and stops the program if it is open. I have a game where when the launcher is closed, it stays open in the background. And I have to end it with task manager or else I can't launch it because steam doesn't like it when an app is open two times (it doesn't allow it), so I would like a batch file that does this for me, then bind it to a macro.
To check if your programm is running : (Here an example with notepad.exe)
#echo off
Set "MyProcess=Notepad.exe"
tasklist | find /i "%MyProcess%">nul && echo %MyProcess% Is running || echo %MyProcess% Is not running
So you can do like that :
#echo off
Set "MyProcess=Notepad.exe"
tasklist | find /i "%MyProcess%">nul && Taskkill /F/IM "%MyProcess%" || start "%MyProcess%"
This is another way to do it:
#echo off
tasklist /fi "imagename eq Launcher.exe" |find "." > nul && taskkill /f /im "Launcher.exe" & goto :EOF
tasklist /fi "imagename eq Launcher.exe" |find "." > nul || start "" steam://rungameid/243870 & goto :EOF
So I figured this out:
#echo off
tasklist /fi "imagename eq Launcher.exe" |find ":" > nul
if errorlevel 0 taskkill /f /im "Launcher.exe" && exit
start steam://rungameid/243870
exit
The logic behind it is that if you can kill the process, then end the prompt before you can create a new session of the process. But if the process can't be killed, then make a new session of it, then end the prompt.

How to run an EXE when another exe is running?

How do I make an exe run automatically when another exe is launched?
Example :
EXE 1 is launched & running
EXE 2 will run automatically once it see that the EXE 1 has already launched.
What is the command do I use in .bat file or autorun.inf?
Here you go
start exe1.exe
:LOOP
tasklist /nh /fi "imagename eq exe1.exe" | find /i "exe1.exe" >nul && start exe2.exe || goto :LOOP
That will start exe1.exe and will keep looking to see if it has started before running exe2.exe.
#ECHO OFF
START /D "path" myexe1.exe
START /D "path" myexe3.exe
Taken from here.
Then save the file as "somename.bat"
Edit
Due to your last comment here's what I found
#echo off
tasklist /nh /fi "imagename eq chrome.exe" | find /i "chrome.exe" >nul && (
echo Windows Media Player is running
) || (
echo Chrome is not running
)
pause>nul
I just copied the code from the link, google can be very helpful.

Resources