congnt92 Posted February 25, 2016 Author Share Posted February 25, 2016 results in isofile[1] NOT DEFINED if the iso has not been found. What is the problem? If you want to set initially Counter to 0 (or to 42) is good as well, as long as you make the check for isofile[0] or for isofile[42]. Your code work fine if there is not ISO was found. But i want to ask you that in case we have 1 (or 2, 3 ...) then if we set counter=1, then if 1 ISO found it will return counter=2, if 2 ISO found it will return =3. I tested it before ask you. Tks 1 Link to comment Share on other sites More sharing options...
bphlpt Posted February 25, 2016 Share Posted February 25, 2016 (edited) Well, again, what's the problem? You seem to think that "counter" is the number of ISOs found. Don't think of it that way. Counter is just a sort of placeholder that will be used for the index of the NEXT ISO that might be found. So, if I understand the batch correctly, after the script has been run, counter-1 is the number of ISOs that have actually been found. Cheers and Regards Edited February 25, 2016 by bphlpt 2 Link to comment Share on other sites More sharing options...
congnt92 Posted February 25, 2016 Author Share Posted February 25, 2016 Tks for your reply, bhplpt. counter-1 is the number of ISOs that have actually been found of course. Because from we begin, we set counter=1. But since you say,You seem to think that "counter" is the number of ISOs found. Counter is just a sort of placeholder that will be used for the index of the NEXT ISO that might be found you're right. I think that (from my above post) and i'm wrong.echo there is/are %counter% ISO found on %path%May Jaclaz was try to talk to me as you say. But he choose other way to explain to me and it make me quite difficult to understand If you want to set initially Counter to 0 (or to 42) is good as well, as long as you make the check for isofile[0] or for isofile[42]. I'm stupid and I must say sorry Jaclaz. ---- So i must add a line,set /a counter2 =%counter% - 1and then full code is@echo offSETLOCAL ENABLEDELAYEDEXPANSIONSET /A Counter=1for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do (dir %%b:\ToolsforPE.ISO >nul 2>nul && (set path=!path! %%b:set isofile[!Counter!]=%%b:\ToolsforPE.ISO&&SET /A Counter+=1)IF NOT DEFINED isofile[1] echo ISO not found)set /A counter2=%counter% - 1echo there is/are %counter2% ISO found on %isopath%pauseTested in 3 cases:- case 1: 0 ISO put on any partition..bat return ISO not found but quite much lines. must to improve it. ISO not foundISO not found.....ISO not foundthere is/are 0 ISO found on - case 2: 1 ISO on C:.bat returnthere is/are 1 ISO found on c: <<<<< perfect. - case 3: 1 ISO (or even 2, 3 ...) but put on D: (and E: F:) not C:.bat return ISO not found <<< Why ? and How can I improve .batthere is/are 1 ISO found on d: Conclution:0 ISO: .bat return very many lines say that 0 ISO found1 ISO (or 2, 3 ...) but put it on from D: (pass C:) then .bat count ISO right but still has a line say that ISO not found1 ISO (or 2 , 3 ...) and put on from C: then .bat work perfect. Can you explain me why?? Tks 1 Link to comment Share on other sites More sharing options...
bphlpt Posted February 25, 2016 Share Posted February 25, 2016 (edited) I see three things, but like jaclaz I'm not going to write your script for you. 1) jaclaz told you, and you say you understand, that "path" is a system variable with a defined use, so you need to use a different variable name in your script. and use that different variable name in ALL places you need that variable. Did you do that? 2) If the line of the script that echoes the "ISO not found" happens every time through the FOR loop iteration, then what do you think might happen if you moved that line of the script outside the FOR loop? What is the purpose of that line? Do you need both that line and the "there is/are ..." line? You might want to think about combining them in an IF .. THEN ... ELSE type structure. 3) Even if you fix your "path" issue, the way your code is now the "there is/are ... " line will have the count correct but only list the location of the last one found, which is all that variable is capable of doing. If you want to list all the locations that multiple ISOs were found you will have to make your code more complicated, both to store the multiple locations in an isopath[x] type variable, like you are doing with isofile[x], and to print them all out. Only then will you be able to give the user a choice on which one to use. Running the script and telling us what it does wrong is good and is the first step in debugging your code. Now you need to start trying to find out how to fix it on your own. This includes looking at other code examples until you know how and WHY they work, and also changing things in your script, multiple times with a small change each time, and rerunning it and observing the different outputs until you understand why it changed. Reading about code is good, but the best way I've found to learn and remember it for later use is through trial and error. Good luck! Cheers and Regards Edited February 25, 2016 by bphlpt 2 Link to comment Share on other sites More sharing options...
congnt92 Posted February 25, 2016 Author Share Posted February 25, 2016 (edited) 1) jaclaz told you, and you say you understand, that "path" is a system variable with a defined use I change is to isopath but there are some typos on above post. But in my .bat from my computer, all was change to isopath. 3) Even if you fix your "path" issue, the way your code is now the "there is/are ... " line will have the count correct but only list the location of the last one found No, isopath work fine for me. It return that there is/are 2 ISO found on c: d: Just only problems is if ISO not put to C:, then it still echo no ISO found and then echo there is/are 1 ISO found on d: I repost my .bat again@echo offSETLOCAL ENABLEDELAYEDEXPANSIONSET /A Counter=1for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do (dir %%b:\ToolsforPE.ISO >nul 2>nul && (set isopath=!isopath! %%b:set isofile[!Counter!]=%%b:\ToolsforPE.ISO&&SET /A Counter+=1)IF NOT DEFINED isofile[1] echo ISO not found)set /A counter2=%counter%-1echo there is/are %counter2% ISO found on %isopath%pauseTks for your hint, I will try to find out and then report. Edited February 25, 2016 by congnt92 1 Link to comment Share on other sites More sharing options...
bphlpt Posted February 25, 2016 Share Posted February 25, 2016 No, isopath work fine for me. It return that there is/are 2 ISO found on c: d:You're right, I missed that. Sorry. Good luck fixing the rest of the issues.Cheers and Regards 2 Link to comment Share on other sites More sharing options...
congnt92 Posted February 25, 2016 Author Share Posted February 25, 2016 (edited) No, isopath work fine for me. It return that there is/are 2 ISO found on c: d:You're right, I missed that. Sorry. Good luck fixing the rest of the issues.Cheers and Regards Yeah, i got it. It work fine but i'm not sure if it's not logical. Full code:No, i'm wrong@ECHO OFFSETLOCAL ENABLEDELAYEDEXPANSIONSET /A Counter=1for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do (dir %%b:\ToolsforPE.ISO >nul 2>nul && (set isopath=!isopath! %%b:set isofile[!Counter!]=%%b:\ToolsforPE.ISO&&SET /A Counter+=1goto :found)):notfoundecho ISO not foundpauseexit:foundset /A counter2=%counter%-1echo there is/are %counter2% ISO found on%isopath%pauseexitEDIT:Oh, i'm sorry, it not return the true counter (always return is 1)I'll try again. EDIT2: seem it work fine. I will test more case to make sure.@echo offSETLOCAL ENABLEDELAYEDEXPANSIONSET /A Counter=0for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do (dir %%b:\ToolsforPE.ISO >nul 2>nul && (set isopath=!isopath! %%b:set isofile[!Counter!]=%%b:\ToolsforPE.ISO&&SET /A Counter+=1)IF NOT DEFINED isofile[0] echo >nul)if "%counter%"=="0" echo ISO not found && pause && exitif "%counter%"=="1" echo there is %counter% ISO file found on %isopath% && pause && exitecho there are %counter% ISO files found on %isopath%pauseexitEDIT3:try to remove IF NOT DEFINED since we not use it. It's work.@echo offSETLOCAL ENABLEDELAYEDEXPANSIONSET /A Counter=0for %%b in (c d e f g h i j k l m n o p q r s t u v w x y z) do (dir %%b:\ToolsforPE.ISO >nul 2>nul && (set isopath=!isopath!%%b:set isofile[!Counter!]=%%b:\ToolsforPE.ISO&&SET /A Counter+=1))if "%counter%"=="0" echo ISO not found && pause && exitif "%counter%"=="1" echo there is %counter% ISO file found on %isopath% && pause && exitecho there are %counter% ISO files found on %isopath%pauseexit Edited February 25, 2016 by congnt92 1 Link to comment Share on other sites More sharing options...
congnt92 Posted February 25, 2016 Author Share Posted February 25, 2016 (edited) I test quite many cases and seem it work fine. First, I want to say thanks to you, Jaclaz, not only this topic, almost topic which I created, you always help me. I know that i'm very stupid and sometimes I ask some stupid question. Please forgive me.Without you, this .bat will never improve.Let me say something, from begin, when i got trouble with fsutil in XP, then I must tryfsutil fsinfo drives > list.txtthentype list.txt | findstr /r %type% and then output if user type a letter which already use.Jaclaz, you help me with for /f token. It work very very perfect. And then, I want to list if there are more than 1 ISO found, you, again help me with a greate code. It's not new for you, but it's very greate for me.I know about "path" variable, about !, [ ] in .batch. Not know all, but a little Finally, with bphlpt's hint, i try to hidden echo output and successed.Just want to say milion thanks to both of you. And again i'm sorry for my bad English, for my bad .bat, for all.God bless you. Edited February 25, 2016 by congnt92 1 Link to comment Share on other sites More sharing options...
jaclaz Posted February 25, 2016 Share Posted February 25, 2016 Only to show off a little bit and to have an occasion to use some math in the batch , how I would write the stuff: @ECHO OFFSETLOCAL ENABLEDELAYEDEXPANSIONSET lookfor=ToolsforPE.ISOSET /A Counter=0FOR /F %%A in ('MOUNTVOL^|FIND ":\"') do (dir /b %%A%lookfor% >nul 2>&1 && (SET /A Counter+=1set isofile[!Counter!]=%%A%lookfor%))SET /A §=0x9EA*2538+0x44F1*17649IF NOT DEFINED isofile[1] ECHO NO iso file was found&GOTO :endECHO Found !counter! item(s):FOR /F "tokens=2,3 delims=[]=" %%A IN ('SET isofile') DO ECHO %%A - %%BIF !counter!.==1. SET chosen=1&GOTO :past_choice:choice_loopSET /P chosen=Please choose item number:FOR /F "delims=%§%" %%? IN ("%chosen%") DO ECHO Invalid input&GOTO :choice_loopIF %chosen% GTR %Counter% ECHO Invalid input&GOTO :choice_loop:past_choiceECHO You chose item #%chosen% which is isofile[%chosen%] i.e. !isofile[%chosen%]!:endECHO.ECHO End of batchjaclaz 2 Link to comment Share on other sites More sharing options...
congnt92 Posted February 25, 2016 Author Share Posted February 25, 2016 Only to show off a little bit and to have an occasion to use some math in the batch , how I would write the stuff: @ECHO OFFSETLOCAL ENABLEDELAYEDEXPANSIONSET lookfor=ToolsforPE.ISOSET /A Counter=0FOR /F %%A in ('MOUNTVOL^|FIND ":\"') do (dir /b %%A%lookfor% >nul 2>&1 && (SET /A Counter+=1set isofile[!Counter!]=%%A%lookfor%))SET /A §=0x9EA*2538+0x44F1*17649IF NOT DEFINED isofile[1] ECHO NO iso file was found&GOTO :endECHO Found !counter! item(s):FOR /F "tokens=2,3 delims=[]=" %%A IN ('SET isofile') DO ECHO %%A - %%BIF !counter!.==1. SET chosen=1&GOTO :past_choice:choice_loopSET /P chosen=Please choose item number:FOR /F "delims=%§%" %%? IN ("%chosen%") DO ECHO Invalid input&GOTO :choice_loopIF %chosen% GTR %Counter% ECHO Invalid input&GOTO :choice_loop:past_choiceECHO You chose item #%chosen% which is isofile[%chosen%] i.e. !isofile[%chosen%]!:endECHO.ECHO End of batchjaclaz Oh, very nice output. You are genius.But mounvol not exist on LiveXP and i want try to change your code with fsutil. Tks. 1 Link to comment Share on other sites More sharing options...
congnt92 Posted February 25, 2016 Author Share Posted February 25, 2016 Hmm, I know a new thing. About 0x9EA*2538+0x44F1*17649. Very very smart way to detect if chosen is invalid or not.How do you think about echo %chose%|findstr /r "[^1-9]" TKs. 1 Link to comment Share on other sites More sharing options...
jaclaz Posted February 25, 2016 Share Posted February 25, 2016 Hmm, I know a new thing. About 0x9EA*2538+0x44F1*17649. Very very smart way to detect if chosen is invalid or not.Of course it is just a joke to show an example of zeroless pandigitals: http://www.worldofnumbers.com/ninedig1.htm How do you think about echo %chose%|findstr /r "[^1-9]" TKs.Sure , that is a "normal" way, but findstr in some cases is extremely slow, and that way the user might input a "special" character like '"%&!()<>| that may make the batch fail, actually it should be: FOR /F "delims=123456789" %%? IN ("!chosen!") DO ... to take advantage of delayed expansion, see: http://www.robvanderwoude.com/battech_inputvalidation_setp.php About Mountvol, if I recall correctly, it is "self-standing", i.e. just adding mountvol.exe to the liveXP build it should work. jaclaz 2 Link to comment Share on other sites More sharing options...
congnt92 Posted February 25, 2016 Author Share Posted February 25, 2016 Hmm, I know a new thing. About 0x9EA*2538+0x44F1*17649. Very very smart way to detect if chosen is invalid or not.Of course it is just a joke to show an example of zeroless pandigitals:http://www.worldofnumbers.com/ninedig1.htmHow do you think about echo %chose%|findstr /r "[^1-9]" TKs.Sure , that is a "normal" way, but findstr in some cases is extremely slow, and that way the user might input a "special" character like '"%&!()<>| that may make the batch fail, actually it should be:FOR /F "delims=123456789" %%? IN ("!chosen!") DO ...to take advantage of delayed expansion, see:http://www.robvanderwoude.com/battech_inputvalidation_setp.phpAbout Mountvol, if I recall correctly, it is "self-standing", i.e. just adding mountvol.exe to the liveXP build it should work. jaclaz Ah, in .batch, some characters such as ^ ! will make .bat error.About mountvol.exe, it's not my problems. I just want to avoid using mountvol in .bat, because if user run .bat in liveXP it will fail.You help me with fsutil. It work and seem all rebuild of WinPE, fsutil is always exist. It's safe way to get letter. 1 Link to comment Share on other sites More sharing options...
Acheron Posted February 26, 2016 Share Posted February 26, 2016 (edited) I have been using some other method to detect a specific VOLUME by reading the name of the label. So you could also look into adding a specific label to your ISO. I use this method in a batch file to automatically create a SVN Depot on the volume with the label BACKUP:@echo off::check if SVN depot existsfor /f "tokens=3,4 skip=9 delims= " %%i in ('cmd /c ^"echo list volume ^| diskpart^"') do ( if /i %%j==BACKUP set SVNPATH=%%i:\SVN depot)if not defined SVNPATH set SVNPATH=%SystemDrive%\SVN depotif not exist "%SVNPATH%" md "%SVNPATH%"::Create SVN servicesc create svnserve binpath= "\"%ProgramFiles%\TortoiseSVN\bin\svnserve.exe\" --service --root \"%SVNPATH%\"" displayname= "Subversion" depend= tcpip start= autonet start svnserve Edited February 26, 2016 by Acheron 1 Link to comment Share on other sites More sharing options...
congnt92 Posted February 26, 2016 Author Share Posted February 26, 2016 I have been using some other method to detect a specific VOLUME by reading the name of the label. So you could also look into adding a specific label to your ISO. I use this method in a batch file to automatically create a SVN Depot on the volume with the label BACKUP:@echo off::check if SVN depot existsfor /f "tokens=3,4 skip=9 delims= " %%i in ('cmd /c ^"echo list volume ^| diskpart^"') do ( if /i %%j==BACKUP set SVNPATH=%%i:\SVN depot)if not defined SVNPATH set SVNPATH=%SystemDrive%\SVN depotif not exist "%SVNPATH%" md "%SVNPATH%"::Create SVN servicesc create svnserve binpath= "\"%ProgramFiles%\TortoiseSVN\bin\svnserve.exe\" --service --root \"%SVNPATH%\"" displayname= "Subversion" depend= tcpip start= autonet start svnserve First, tks for your hint. I'll copy your code and save to my_bat_collection.txt file. I'm learning about token and delims. Your example is very helpful.But i must say sorry to you, because your case is not same with mine, and i can't use it.My .bat was create for user run to mount ISO file after boot to WinPE and it cannot find ISO file base on Label since Label is named by user.But, even your code is not work for my case, it still is good example for me study .bat code.Tks Acheron. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now