Speeddymon Posted October 5, 2009 Share Posted October 5, 2009 Firstly, is it possible to put the output of a program I am running into an environment variable, or multiple, and if so, how do I do it?What I'm trying to do is take a directory listing and put each line of output into an environment variable which I can then run through a for loop. I'd use shift to shift each new directory I want to go to into %1. The goal is to extract a bunch of rar files in different directories without knowing the full path to each .rar file. Basically a mass extract.Something like the following pseudo code:@echo offfor %%dirname in (dir /a:d /o:gne /b /s) do cd %%dirname rar x *.rarIt gets all of the directories below the current, traverses them, extracts whatever rar file is in that directory (they are all old style rars with the .rar -> .r00 -> .r01 etc extensions), and then moves on to the next directory. Link to comment Share on other sites More sharing options...
DigeratiPrime Posted October 5, 2009 Share Posted October 5, 2009 You can pipe a program output to another program using the | character such asipconfig | clipAs for your situation I would probably use Search to find all the RARs, select and move them to the target folder, then select and extract all of them from the context menu.WinRAR does ship with a cmd line tool called rar.exeRAR 3.90 Copyright © 1993-2009 Alexander Roshal 16 Aug 2009Registered to Vinayak GanapathyUsage: rar <command> -<switch 1> -<switch N> <archive> <files...> <@listfiles...> <path_to_extract\><Commands> a Add files to archive c Add archive comment cf Add files comment ch Change archive parameters cw Write archive comment to file d Delete files from archive e Extract files to current directory f Freshen files in archive i[par]=<str> Find string in archives k Lock archive l[t,b] List archive [technical, bare] m[f] Move to archive [files only] p Print file to stdout r Repair archive rc Reconstruct missing volumes rn Rename archived files rr[N] Add data recovery record rv[N] Create recovery volumes s[name|-] Convert archive to or from SFX t Test archive files u Update files in archive v[t,b] Verbosely list archive [technical,bare] x Extract files with full path<Switches> - Stop switches scanning ac Clear Archive attribute after compression or extraction ad Append archive name to destination path ag[format] Generate archive name using the current date ai Ignore file attributes ao Add files with Archive attribute set ap<path> Set path inside archive as Synchronize archive contents av Put authenticity verification (registered versions only) av- Disable authenticity verification check c- Disable comments show cfg- Disable read configuration cl Convert names to lower case cu Convert names to upper case df Delete files after archiving dh Open shared files dr Delete files to Recycle Bin ds Disable name sort for solid archive dw Wipe files after archiving e[+]<attr> Set file exclude and include attributes ed Do not add empty directories en Do not put 'end of archive' block ep Exclude paths from names ep1 Exclude base directory from names ep2 Expand paths to full ep3 Expand paths to full including the drive letter f Freshen files hp[password] Encrypt both file data and headers id[c,d,p,q] Disable messages ieml[addr] Send archive by email ierr Send all messages to stderr ilog[name] Log errors to file (registered versions only) inul Disable all messages ioff Turn PC off after completing an operation isnd Enable sound k Lock archive kb Keep broken extracted files m<0..5> Set compression level (0-store...3-default...5-maximal) mc<par> Set advanced compression parameters md<size> Dictionary size in KB (64,128,256,512,1024,2048,4096 or A-G) ms[ext;ext] Specify file types to store mt<threads> Set the number of threads n<file> Include only specified file n@ Read file names to include from stdin n@<list> Include files listed in specified list file o[+|-] Set the overwrite mode oc Set NTFS Compressed attribute or Rename files automatically os Save NTFS streams ow Save or restore file owner and group p[password] Set password p- Do not query password r Recurse subdirectories r- Disable recursion r0 Recurse subdirectories for wildcard names only ri<P>[:<S>] Set priority (0-default,1-min..15-max) and sleep time in ms rr[N] Add data recovery record rv[N] Create recovery volumes s[<N>,v[-],e] Create solid archive s- Disable solid archiving sc<chr>[obj] Specify the character set sfx[name] Create SFX archive si[name] Read data from standard input (stdin) sl<size> Process files with size less than specified sm<size> Process files with size more than specified t Test files after archiving ta<date> Process files modified after <date> in YYYYMMDDHHMMSS format tb<date> Process files modified before <date> in YYYYMMDDHHMMSS format tk Keep original archive time tl Set archive time to latest file tn<time> Process files newer than <time> to<time> Process files older than <time> ts<m,c,a>[N] Save or restore file time (modification, creation, access) u Update files v Create volumes with size autodetection or list all volumes v<size>[k,b] Create volumes with size=<size>*1000 [*1024, *1] vd Erase disk contents before creating volume ver[n] File version control vn Use the old style volume naming scheme vp Pause before each volume w<path> Assign work directory x<file> Exclude specified file x@ Read file names to exclude from stdin x@<list> Exclude files listed in specified list file y Assume Yes on all queries z[file] Read archive comment from file Link to comment Share on other sites More sharing options...
jaclaz Posted October 5, 2009 Share Posted October 5, 2009 (edited) Something like the following pseudo code:@echo offfor %%dirname in (dir /a:d /o:gne /b /s) do cd %%dirname rar x *.rarIt gets all of the directories below the current, traverses them, extracts whatever rar file is in that directory (they are all old style rars with the .rar -> .r00 -> .r01 etc extensions), and then moves on to the next directory.Something like this:@echo offfor /F "tokens=1 delims=" %%A in ('dir /a:d /o:gne /b /s') do cd "%%A"& rar x *.rarReference:http://www.robvanderwoude.com/ntfor.phphttp://www.robvanderwoude.com/ntfortokens.phpAlternative:@echo offFOR /F "tokens=1 delims=" %%A in ('dir /b /s *.rar') DO (CD "%%~dpA"rar x "%%~nxA")jaclaz Edited October 6, 2009 by jaclaz Link to comment Share on other sites More sharing options...
Speeddymon Posted October 6, 2009 Author Share Posted October 6, 2009 This ended up working for me, full code, use and modify as needed@ECHO offECHO Starting Batch ExtractECHO Adding RAR and ECM to PATHSETLOCAL PATH=%PATH%;C:\Program Files (x86)\WinRAR;C:\Program Files (x86)\ECMECHO Parsing .part01.rar style filesFOR /f "usebackq tokens=*" %%a IN (`dir /a:-d /b /o:gne /s *.part01.rar`) DO (ECHO Changing to %%~dpa & cd %%~dpa & rar e %%~nxa Extracted\)ENDLOCALThe purpose of this program is to take a bunch of ISO images I made a long time ago, extract them one at a time, then run a program called ECM on them to remove the error code stuff from each image file, then recompress it with 7zip, and delete the original rars and the extracted iso and ecm file. It saves me about 50mb per image after compression. That may not seem like a lot, until you consider that I make a backup of everything I ever buy bc I am bad with scratching cd's. I have a 1tb terastation nearly full of images like that (around 700GB of actual usable drive space with raid 5).I've removed the part of the for loop that runs ECM, recompresses the data with 7zip and removes the originals plus extracted stuff.I had to use the usebackq option to the for loop to get it to process the dir command, and set tokens=* to get it to output the full file name including spaces into %%aHope this helps someone else in the future. Credit for some of the code goes to computerhope.com. 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