I'm trying to get the output of the WMIC command to assign variables to each line.
I'm trying to get the out put to look like this:
1 first program installed
2 second program installed
3 third program installed
4 fourth program installed
5 ...etc
#Echo off
wmic /output:file.txt product get name /format:csv
rem wmic product get name
#Echo Off
SetLocal EnableDelayedExpansion
Set n=
Set _InputFile=c:\users\jorge\desktop\file.txt
For /F "tokens=*" %%I IN (%_InputFile%) DO (
Set /a n+=1
Set _var!n!=%%I
)
:: This line will display the variables just assigned
:: For testing only, delete when not needed
Set _
EndLocal
pause
This won't work because wmic will give you Unicode file that for /f can not read (see here). Workaround is to use ('type file') instead:
#Echo off
:: not really need a csv here...
wmic /output:file.txt product get name /format:table
Set n=0
:: Suggest to use internal call :label rather than delayed expansion
For /F "tokens=* skip=1 delims=" %%I IN ('type file.txt') DO #call :Assign %%I
Set _
pause
goto :EOF
:Assign
Set /a n+=1
Set _var%n% = %*
goto :EOF
Related
Trying to get the number of disks in a system using diskpart without using a temp file. This works on the command line:
echo list disk | diskpart | find /C "Disk"
but I can't figure out how to redirect the result into a batch var. Of course the number printed by the above pipeline is higher due to labels, but they are constant (divide result by 3 for actual number of disks).
Any ideas?
I've tried:
set /A disks=<echo list disk...
set /A disks<echo list disk...
set /A disks= (echo list disk ...)
You need FOR F for capture the output of a program.
set "cmd=echo list disk | diskpart | find /C "Disk""
setlocal EnableDelayedExpansion
FOR /F "usebackq delims=" %%A in (`!cmd!`) do (
set var=%%A
)
echo !var!
You can do it with a batch file using WMIC like this:
#echo off
wmic logicaldisk get caption,providername,drivetype,volumename > ListDisk.txt
Start "" ListDisk.txt
pause
And if you want to echo the fixed drive like that :
#echo off
for /f "tokens=2" %%i in ('wmic logicaldisk where "drivetype=3" ^|find /i ":"') do (Set FixedDrive=%%i)
echo %FixedDrive%
pause
best user,
I tried to assign variables from a txt file in batch. I have a text file called "Final.txt".
Final.txt:
0216027232411405
02160272b6172505
1115fb9c6f423305
1645fb9c6f423305
0000fb9c6f423305
script that I tested till now:
#echo off
setlocal ENABLEDELAYEDEXPANSION
set vidx=0
for /F "tokens=*" %%A in (Final.txt) do (
SET /A vidx=!vidx! + 1
set var!vidx!=%%A
)
set var
(
set /p var1=
set /p var2=
set /p var3=
)<Final.txt
#echo off
setlocal enabledelayedexpansion
set Counter=1
for /f %%x in ("Final.txt") do (
set "Line_!Counter!=%%x"
set /a Counter+1
if Counter== 0 goto :EOF
)
set /a NumLines=Counter - 1
echo %Line_1%
pause
:EOF
Echo please connect a device
pause
exit
The problem is that the code works, but it only assign the first line of the text file. I want to assign every line in the text file to a variable.Now I only have 5 devices,but in the future iw till expand to more lines. I will do more research, but if you have a solution. Your answers are always welcome!. If I can figure it out I am going to use it in my other script so you are a life saver. I only want to use batch for this.
I'm new in Windows batch programming and I have found problems in the variable assignment. This is my code:
#echo off
setlocal enabledelayedexpansion
set Video=1
set FILEMEDIA=outputMedia.txt
for /f %%a in (%FILEMEDIA%) do (
set /a Video=%Video%+1
#echo Video
set file=%%a
#echo file
)
If FILEMEDIA has two lines I would like to obtain Video=2 and the line in file variable. However, at the end I obtain Video=1 and an error when I tried to print file (echo is off).
Some kind of duplicate with How do I increment a DOS variable in a FOR /F loop?
Variables that should be delay expanded are referenced with !VARIABLE! instead of %VARIABLE%.
#echo off
setlocal enabledelayedexpansion
set Video=1
set FILEMEDIA=outputMedia.txt
for /f %%a in (%FILEMEDIA%) do (
set /a Video+=1
#echo !Video!
set file=%%a
#echo file
)
endlocal
I've question about this variables.How can I store result of a command into a variable? For example: saving drive serial into location variable.
thanks.
E.g:
#ECHO OFF
SET location=vol
ECHO We're working with %location%
for /f "delims=" %%x in ('your command and parameters') do set "var=%%x"
where the 'single quotes' are required around the command from which you wish to save output.
Edit - now we know which command.
Comment - one variable can contain up to ~8,000 characters.
Here's a routine that will set the values in $1...$whatever and the entire set in $all with each field enclosed in angle-brackets.
#ECHO OFF
SETLOCAL
SET "$all="
FOR /f "tokens=1*delims=:" %%a IN (
'systeminfo 2^>nul^|findstr /n /r "$"'
) DO (
SET "$%%a=%%b"
FOR /f "tokens=*" %%c IN ("%%b") DO CALL SET "$all=%%$all%%<%%c>"
SET /a max=%%a
)
SET $
pause
FOR /l %%z IN (1,1,%max%) DO CALL ECHO %%$%%z%%
GOTO :EOF
thank you...please see my batch file contents:
for /f "delims=" %%x in ('systeminfo') do set "var=%%x"
command_line.exe %var%
only last line of 'systeminfo' saved in var variable and it is:
"data execution perevention available: yes"
I want to store all contetnt of systeminfo into variable!
thank you.I'm too basic
do you mean result of systeminfo is into all variable? at the end of your code can I add this command:
start command_line.exe $%all%
is this true?
can you put complete code for my batch file?
My goal is to be able to go into a specific folder, run a task, then when that task is completed, move to another folder and repeat.
#echo off
setlocal ENABLEDELAYEDEXPANSION
set vidx=0
for /F "tokens=*" %%A in (z:\desktop\cookieclean\test.txt) do (
SET /A vidx=!vidx! + 1
set var!vidx!=%%A
)
set var
echo %var!vidx!%
set /a vidx+=1
echo %var!vidx!%
endlocal
That is the code I am working on. I copied the code from somewhere else on the web and tried to get it to do what I wanted. the code above is just me attempting to take the test file, throwing in the 3 lines of text as the variables, then having it increment.
I'm sure it's something super simple, but I've been trying to get this to work for hours, and my rookie-ness is showing.
A pseudo code of what I'm TRYING to do would be
Input variables from text
Open folder containing files
Delete files that are older than X days
Move active folder to next folder in directory
Delete files that are older than X days
Loop
End
I'm just trying to use the cmd line.
You have your delayed and normal expansion reversed. You want the inner variable expanded before the outer one: !var%vidx%!
Your SET /A statement in your loop works, but you do not need to expand the variable. This would work just as well: SET /A vidx=vidx + 1, or better yet: SET /A vidx+=1
I also believe your logic to show results is incorrect. The code below should work.
#echo off
setlocal enableDelayedExpansion
set "vidx=0"
for /f "tokens=*" %%A in (z:\desktop\cookieclean\test.txt) do (
set /a vidx+=1
set "var!vidx!=%%A"
)
set var
set "cnt=vidx"
set "vidx=1"
:loop
if %vidx% leq %cnt% (
echo !var%vidx%!
set /a vidx+=1
goto :loop
)
endlocal
Here is a much simpler and more efficient method using FOR /L instead of a GOTO loop.
#echo off
setlocal enableDelayedExpansion
set "vidx=0"
for /f "tokens=*" %%A in (z:\desktop\cookieclean\test.txt) do (
set /a vidx+=1
set "var!vidx!=%%A"
)
set var
for /l %%N in (1 1 %vidx%) do echo !var%%N!
endlocal