Jump to content

Environment variables


Recommended Posts

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 off
for %%dirname in (dir /a:d /o:gne /b /s) do cd %%dirname rar x *.rar

It 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


You can pipe a program output to another program using the | character such as

ipconfig | clip

As 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.exe

RAR 3.90 Copyright © 1993-2009 Alexander Roshal 16 Aug 2009

Registered to Vinayak Ganapathy

Usage: 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

Something like the following pseudo code:

@echo off
for %%dirname in (dir /a:d /o:gne /b /s) do cd %%dirname rar x *.rar

It 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 off
for /F "tokens=1 delims=" %%A in ('dir /a:d /o:gne /b /s') do cd "%%A"& rar x *.rar

Reference:

http://www.robvanderwoude.com/ntfor.php

http://www.robvanderwoude.com/ntfortokens.php

Alternative:

@echo off
FOR /F "tokens=1 delims=" %%A in ('dir /b /s *.rar') DO (
CD "%%~dpA"
rar x "%%~nxA"
)

jaclaz

Edited by jaclaz
Link to comment
Share on other sites

This ended up working for me, full code, use and modify as needed

@ECHO off
ECHO Starting Batch Extract
ECHO Adding RAR and ECM to PATH
SETLOCAL PATH=%PATH%;C:\Program Files (x86)\WinRAR;C:\Program Files (x86)\ECM
ECHO Parsing .part01.rar style files
FOR /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\)
ENDLOCAL

The 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 %%a

Hope this helps someone else in the future. Credit for some of the code goes to computerhope.com.

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.


×
×
  • Create New...