Hello dear people and others,
Today i wanted to create a simple script, thought it would be easy to store the outcome to var of the following command:
wmic bios get serialnumber | findstr /N /V SerialNumber
Outcome:
2:H3GK4S1
3:
The problem is when i try to get the serial with wmic, it returns the string as expected but also an empty string/line. When i try to store the serial to a variable it stores it and then directly overwrites it with the empty string. This is the function i nearly got working now:
FOR /F "tokens=*" %g IN ('Wmic Bios Get SerialNumber ^| FINDSTR /N /V SerialNumber') DO (SET serial=%g & ECHO %g)
And this gives the following output:
FOR /F "tokens=*" %g IN ('Wmic Bios Get SerialNumber ^| FINDSTR /N /V SerialNumber') DO (SET serial=%g & ECHO %g)
2:H3GK4S1
3:
As can be seen above, the loop overwrites the serial var, if someone can help me towards the right directon to get this working, would be mad.
At the Command Prompt:
For /F "Tokens=1* Delims==" %g In ('WMIC BIOS Get SerialNumber /Value') Do #For /F "Tokens=*" %i In ("%h") Do #Set "serial=%i" & Echo %i
Or in a batch file:
#For /F "Tokens=1* Delims==" %%g In ('WMIC BIOS Get SerialNumber /Value'
) Do #For /F "Tokens=*" %%i In ("%%h") Do #Set "serial=%%i" & Echo %%i
#Pause
EditIf you're happy to use a labelled section in your batch file:
#Echo Off
Set "serial="
For /F "Skip=1 Delims=" %%A In ('WMIC BIOS Get SerialNumber') Do If Not Defined serial Call :Sub %%A
Set serial 2>Nul
Pause
GoTo :EOF
:Sub
Set "serial=%*"
GoTo :EOF
Try like this:
FOR /F "tokens=*" %g IN ('Wmic Bios Get SerialNumber /format:value') DO for /f "tokens=* delims=" %# in ("%g") do set "serial=%#"
echo %serial%
Mind that's a command that should be executed in the command prompt directly.For a batch file you'll need to double the % in the for loop tokens.
In a batch file, you can also use a goto to end the loop after the first iteration :
#echo off
for /f "tokens=2 delims=:" %%a in ('wmic bios get serialnumber ^| findstr /N /V SerialNumber') do (
set "$var=%%a"
goto:next
)
exit/b
:next
echo Result=^> [%$var: =%]
Related
I am learning to code the BATCH,
I would like to make a small .bat executable to retrieve various information on computers that I reinstall, to avoid having to navigate through several sections of the windows control panel.
I have already managed to retrieve some information using "for /f", but I must admit that I still don't understand how this command works.
I haven't found any more info on what I'm looking for, so I'm asking for help which would be very welcome.
I'm not looking for a copy/paste solution, I'd like someone to explain my mistake and help me solve it so I can better understand where I went wrong.
Anyway, after reading this indigestible pamphlet, here are the commands I'm looking to run:
for /f "tokens=2 delims==" %%I in (
'wmic LOGICALDISK where DriveType!=4 get DeviceID /value'
) do for /f "delims=" %%# in ("%%I") do set "deviceid=%%~#"
for /f "tokens=2 delims==" %%I in (
'wmic LOGICALDISK where drivetype!=4 get description /value'
) do for /f "delims=" %%# in ("%%I") do set "description=%%~#"
for /f "tokens=2 delims==" %%I in (
'wmic LOGICALDISK where drivetype!=4 get volumename /value'
) do for /f "delims=" %%# in ("%%I") do set "volumename=%%~#"
for /f "tokens=2 delims==" %%I in (
'wmic LOGICALDISK where drivetype!=4 get Size /value'
) do for /f "delims=" %%# in ("%%I") do set "Size=%%~#"
and this is what I get back:
C:\Users\rv\Desktop>for /F "tokens=2 delims==" %I in ('wmic LOGICALDISK where DriveType! 4 get DeviceID /value') do for /F "delims=" %# in ("%I") do set "deviceid=%~#"
4 - Verbe de l'alias non valide.
C:\Users\rv\Desktop>for /F "tokens=2 delims==" %I in ('wmic LOGICALDISK where drivetype! 4 get description /value') do for /F "delims=" %# in ("%I") do set "description=%~#"
4 - Verbe de l'alias non valide.
C:\Users\rv\Desktop>for /F "tokens=2 delims==" %I in ('wmic LOGICALDISK where drivetype! 4 get volumename /value') do for /F "delims=" %# in ("%I") do set "volumename=%~#"
4 - Verbe de l'alias non valide.
C:\Users\rv\Desktop>for /F "tokens=2 delims==" %I in ('wmic LOGICALDISK where drivetype! 4 get Size /value') do for /F "delims=" %# in ("%I") do set "Size=%~#"
4 - Verbe de l'alias non valide.
I think this is due to a misuse of "tokens=" and "delims=" on my part ?
Mmm... I used to think/solve this type of problems in "opposite order"... Please, follow me.
I started typing this command at the command-prompt:
C:\> wmic LOGICALDISK where DriveType!=4 get DeviceID /value
DeviceID=C:
DeviceID=D:
Ok. I always try to make things in an efficient way. If I can get the same result from a single command instead of 4 commands, then I always opted for the single one:
C:\> wmic LOGICALDISK where DriveType!=4 get DeviceID,Description,VolumeName,Size /value
Description=Local Fixed Disk
DeviceID=C:
Size=982768414720
VolumeName=Windows
Description=Local Fixed Disk
DeviceID=D:
Size=16111366144
VolumeName=RECOVERY
Good! In order to "get" such values, we need to execute the wmic command from a for /F command, so I wrote this simple Batch file at first:
for /F "delims=" %%a in ('wmic LOGICALDISK where DriveType!=4 get DeviceID,Description,VolumeName,Size /value') do #echo [%%a]
... and the problems started:
C:\> for /F "delims=" %a in ('wmic LOGICALDISK where DriveType! 4 get DeviceID Description VolumeName Size /value') do #echo [%a]
4 - Verbo de alias no válido.
If you compare the source line vs. the executed command, you'll realize that the equal-sign and the commas disappeared! This happens because these characters: = , ; works as separators for items in most commands (besides space and TAB). This is this way just because MS (Microsoft) decided that... :(
There are two ways to solve this problem: individually caret-^escape each one of these characters OR enclose the whole command in quotes. I choose the second method because it is simpler:
for /F "delims=" %%a in ('"wmic LOGICALDISK where DriveType!=4 get DeviceID,Description,VolumeName,Size /value"') do #echo [%%a]
And the output is:
C:\> for /F "delims=" %a in ('"wmic LOGICALDISK where DriveType!=4 get DeviceID,Description,VolumeName,Size /value"') do #echo [%a]
]
]
]Description=Local Fixed Disk
]DeviceID=C:
]Size=982768414720
]VolumeName=Windows
]
]
]Description=Local Fixed Disk
]DeviceID=D:
]Size=16111366144
]VolumeName=RECOVERY
]
]
]
So far so good, we have solved the equal-sign and comma problem... However, a new problem arises: the lines we think were empty really contain a CR character! There are a couple methods to solve this new point, and the one you used before is the simplest one: process the wmic output lines in a second FOR command:
for /F "delims=" %%a in (
'"wmic LOGICALDISK where DriveType!=4 get DeviceID,Description,VolumeName,Size /value"'
) do #(
for /F "delims=" %%b in ("%%a") do #echo [%%b]
)
And the output is:
C:\> for /F "delims=" %a in ('"wmic LOGICALDISK where DriveType!=4 get DeviceID,Description,VolumeName,Size /value"') do #(for /F "delims=" %b in ("%a") do #echo [%b]
)
[Description=Local Fixed Disk]
[DeviceID=C:]
[Size=982768414720]
[VolumeName=Windows]
[Description=Local Fixed Disk]
[DeviceID=D:]
[Size=16111366144]
[VolumeName=RECOVERY]
Perfect! Now, that we are sure that the code will process the values we want, we insert an #echo off command at beginning and split each line in two parts, the variable and its value:
#echo off
for /F "delims=" %%a in (
'"wmic LOGICALDISK where DriveType!=4 get DeviceID,Description,VolumeName,Size /value"'
) do (
for /F "tokens=1,2 delims==" %%b in ("%%a") do echo [%%b=%%c]
)
The output is the same than before.
Finally, we insert code to save the value of each variable and process all variables each time that a group is complete; that is:
#echo off
setlocal EnableDelayedExpansion
set "VolumeName="
for /F "delims=" %%a in (
'"wmic LOGICALDISK where DriveType^!=4 get DeviceID,Description,VolumeName,Size /value"'
) do (
for /F "tokens=1,2 delims==" %%b in ("%%a") do set "%%b=%%c"
if defined VolumeName (
echo/
echo ===== New disk =====
echo Description=!Description!
echo DeviceID=!DeviceID!
echo Size=!Size!
echo VolumeName=!VolumeName!
set "VolumeName="
)
)
The final output:
===== New disk =====
Description=Local Fixed Disk
DeviceID=C:
Size=982768414720
VolumeName=Windows
===== New disk =====
Description=Local Fixed Disk
DeviceID=D:
Size=16111366144
VolumeName=RECOVERY
Note that in the last code the exclamation-mark needs to be ^escaped. This is because the EnableDelayedExpansion setlocal's option enables the ! as a method to expand variables additional to the %standard% one. You can find a lot of questions/answers about this topic in this site...
How-to: Escape Characters, Delimiters and Quotes at the Windows command line.
In Windows cmd/batch scripting, parameters are most often separated by spaces, but any of the following are also valid delimiters:
, (U+002C, Comma)
; (U+003B, Semicolon)
= (U+003D, Equals Sign)
(U+0020, Space)
␉ (U+0009, Character Tabulation)
You need to escape the Equals Sign in DriveType!=4. Use any of the following:
"DriveType!=4" (using "Double Quotes")
DriveType!^=4 (using common escape character ^ (U+005E, Circumflex Accent))
I am trying to run the following script
#ECHO OFF
FOR /F "Skip=1 Tokens=*" %%G IN ('WMIC COMPUTERSYSTEM GET Manufacturer') DO (SET "DeviceOEM=%%G")
ECHO OEM: %DeviceOEM%
PAUSE
However all I get is "ECHO OEM:", which indicates that %DeviceOEM% is blank.
Now if I run
FOR /F "Skip=1 Tokens=*" %%G IN ('WMIC COMPUTERSYSTEM GET Manufacturer') DO (ECHO %%G)
PAUSE
Then I get a real answer of my OEM.
I don't understand where this SET command is failing.
When delim is issued on = it will only assign the value after the = to the value. We therefore change the wmic command to issue the result with /value which will return Manufacturer=<name of OEM> where we only use everything post =
#echo off
For /F "tokens=2*delims==" %%G in ('WMIC COMPUTERSYSTEM GET Manufacturer /value') do SET "DeviceOEM=%%G"
echo OEM: %DeviceOEM%
I am currently using this quick batch file to get info that I need from a variety of computers. My problem is that it creates the CSV file, but it is all one column. I am planning to use python to manipulate the data, but it is difficult to do so if it is all one column.
#echo off
(systeminfo | findstr /c:"Host Name"
systeminfo | findstr /c:"OS Name"
systeminfo | findstr /c:"System Model"
systeminfo | findstr /c:"System type"
systeminfo | findstr /c:"Total Physical Memory"
ipconfig | findstr IPv4
wmic diskdrive get size
wmic bios get serialnumber
wmic cpu get name)>>in.csv
All output, single line, comma delimited, and sub-delimits on both IP address and disk drive, since there are multiple of those. Sub-delimit is a semi-colon.
Output:
MyBox,36527083,Packard Bell,3-2,Microsoft Windows 10,x64-based PC,17087881216,192.168.121.1;192.168.3.1;10.11.18.112,Intel(R) Core(TM) i7-4710HQ CPU # 2.50GHz,2000396321280;63992678400;4000784417280;512105932800;1500299297280
Cmd:
#echo off
setlocal EnableDelayedExpansion
set "zManufacturer="
set "zHostName="
set "zOsName="
set "zSystemModel="
set "zSystemType="
set "zTotalPhysicalMemory="
set "zIpAddresses="
set "zHddSizes="
set "zCpuName="
set "zBiosSerial="
for /f "skip=1 tokens=1-6 delims=," %%A in ('wmic computersystem get Manufacturer^,Model^,TotalPhysicalMemory^,SystemType^,Workgroup /format:csv ^| findstr ","') do (
set "zHostName=%%A"
set "zManufacturer=%%B"
set "zSystemModel=%%C"
set "zSystemType=%%D"
set "zTotalPhysicalMemory=%%E"
)
for /f "tokens=2 delims=:" %%A in ('ipconfig ^| findstr /i ipv4') do set "zIpAddresses=!zIpAddresses!%%A"
set "zIpAddresses=!zIpAddresses:~1!"
set "zIpAddresses=!zIpAddresses: =;!"
for /f "tokens=1 delims=|" %%A in ('wmic os get name ^|findstr "|"') do set "zOsName=%%A"
for /f "tokens=2 delims=," %%A in ('wmic bios get serialnumber^,version /format:csv') do set "zBiosSerial=%%A"
for /f "tokens=2 delims=," %%A in ('wmic cpu get name^,version /format:csv') do set "zCpuName=%%A"
for /f "skip=1 tokens=2 delims=," %%A in ('wmic diskdrive get size^,TracksPerCylinder /format:csv ^|findstr /v /r "^$"') do set "zHddSizes=!zHddSizes!;%%A"
set "zHddSizes=!zHddSizes:~1!"
echo !zHostName!,!zBiosSerial!,!zManufacturer!,!zSystemModel!,!zOsName!,!zSystemType!,!zTotalPhysicalMemory!,!zIpAddresses!,!zCpuName!,!zHddSizes!
I have the code below that returns the hostname and IP address of a given server. How can i only have the hostname as the output?
FOR /F %%i in (servers.txt) do FOR /F "skip=3 delims=: tokens=2 usebackq" %%j in (`nslookup %%i`) do #echo %%j >> Devices_With_IP.txt
Assuming your machine uses English:
FOR /F %%i in (servers.txt) do FOR /F "delims=: tokens=2" %%j in (
'nslookup %%i ^| find "Name:"'
) do #echo %%j >> Devices_With_IP.txt
Try using the findstr command on the output of your nslookup to get only the line containing "Name".
FOR /F %%i in (servers.txt) do FOR /F "tokens=2 usebackq delims=: " %%j in (`nslookup %%i ^| findstr Name`) do #echo %%j >> Devices_With_IP.txt
Note that I also rearranged the /F conditions in the second loop in order to include space as a deliminator, this removes the leading spaces before the output.
Using the find command instead of findstr -
FOR /F %%i in (servers.txt) do FOR /F "tokens=2 usebackq delims=: " %%j in (`nslookup %%i ^| find "Name"`) do #echo %%j >> Devices_With_IP.txt
Just realized that using find instead of findstr makes this (almost) exactly the same as dbenham's answer.
Hello having my first go with a BATCH script, I'm getting the size of the HDD as follow:
wmic diskdrive get size
Which works fine but I'd like to store this value into a variable for later use, such as using ECHO to display the value.
I'm not sure how I set the output of the above command to a variable. I went with:
SET hddbytes=wmic diskdrive get size
But this just sets the variable to the above text string and not the output.
For usage in batch file. From command line, replace %% with %
for /f "tokens=*" %%f in ('wmic diskdrive get size /value ^| find "="') do set "%%f"
echo %size%
Or, if you want to use you prefered variable
for /f "tokens=2 delims==" %%f in ('wmic diskdrive get size /value ^| find "="') do set "myVar=%%f"
echo %myVar%
You want:
for /f %%a in ('wmic diskdrive get size^|findstr [0-9]') do echo %%a
Updated:
WMIC's output could get a trailing Carriage Return in some environment:
Size <CR>
<CR><LF>
256052966400<CR>
<CR><LF>
500105249280<CR>
<CR><LF>
15496427520 <CR>
<CR><LF>
use csv format, and use FOR loop to truncate the wanted value from the wmic output:
For /F "tokens=2,3 delims=," %%a in ('"wmic diskdrive get size,Status
/format:csv |findstr "[0-9]" "') do (
echo "%%a"
)
Another Batch Script Example:
setlocal ENABLEDELAYEDEXPANSION
:: You can change active code page as well::
#chcp 936 >NUL
:: [example] Remove all network printers:
for /F "tokens=2,3 delims=," %%a in ('"wmic printer where 'local=FALSE' get Name,PrinterStatus /format:csv |findstr "." "') do (
echo "%%a"
rundll32 printui.dll,PrintUIEntry /n "%%a" /dn /q
)
for /f "delims=" %%w in ('wmic diskdrive get size /format:Textvaluelist.xsl') do for /f "usebackq delims=" %%a in ('%%w') do set %%a
echo %size%