I'm writing a batch-file to update the BIOS on the PCs within my organization using the HP Bios Configuration Utility and I need a it to check a registry value in order to apply the appropriate configuration.
I found this code on the internet but can't get it to work:
#echo off
ECHO BIOS check HP
CD c:\Batch\bios\HP
reg query "HKEY_LOCAL_MACHINE\Hardware\Description\system\BIOS" /v "SystemProductName" | find /i "HP ProDesk 600 G3 PCI MT"
if errorlevel 0 (
echo HP ProDesk 600 G3 PCI MT
goto :end
)
reg query "HKEY_LOCAL_MACHINE\Hardware\Description\system\BIOS" /v "SystemProductName" | find /i "HP EliteDesk 800 G1 TWR"
if errorlevel 0 (
echo HP EliteDesk 800 G1 TWR
goto :end
)
:end
PAUSE
The error level doesn't work but it does look for the value.
This is what I'm using currently but systeminfo is taking too long to load on some PCs with a lot of hotfixes:
systeminfo > C:\Temp\Sysinf%t%.txt
CD c:\Batch\bios\HP
find "System Model: HP ProDesk 600 G3 PCI MT" C:\Temp\Sysinf%t%.txt
if %errorlevel%==0 goto :Leg_HP_ProDesk_600_G3_PCI_MT
find "System Manufacturer: HP EliteDesk 800 G1 TWR" C:\Temp\Sysinf%t%.txt
if %errorlevel%==0 goto :Leg_HP_EliteDesk_800_G1_TWR
:Leg_HP_ProDesk_600_G3_PCI_MT
BiosConfigUtility64.exe /setconfig:Leg_HP_ProDesk_600_G3_PCI_MT.txt /cspwdfile:"currentpassword.bin"
goto :Setpass
:Leg_HP_EliteDesk_800_G1_TWR
BiosConfigUtility64.exe /setconfig:Leg_HP_EliteDesk_800_G1_TWR.txt /cspwdfile:"currentpassword.bin"
goto :Setpass
:Setpass
BIOSConfigUtility64.exe /nspwdfile:"newpassword.bin" /cspwdfile:"currentpassword.bin"
I would expect something like this to work reasonably well, as long as BiosConfigUtility64.exe the .txt and .bin files are in C:\Batch\bios\HP:
#Set "SPN="&For /F "Tokens=2*" %%A In ('^""%__AppDir__%reg.exe" Query ^
"HKLM\Hardware\Description\system\BIOS" /V "SystemProductName" 2^>NUL^|^
"%__AppDir__%findstr.exe" /IC:"HP ProDesk 600 G3 PCI MT" /C:"HP EliteDesk 800 G1 TWR"^"'
)Do #Set "SPN=%%B"
#If Not Defined SPN Exit /B
#CD /D "C:\Batch\bios\HP" 2>NUL||Exit /B
#"BIOSConfigUtility64.exe" /SetConfig:"Leg_%SPN: =_%.txt" /cspwdfile:"currentpassword.bin"
#"BIOSConfigUtility64.exe" /nspwdfile:"newpassword.bin" /cspwdfile:"currentpassword.bin"
If you create all of your text files using the same naming format, (the returned name with spaces replaced with underscores and prefixed with Leg_), you could forget about the using findstr, just save the value and then check for an existing, matching .txt file:
#CD /D "C:\Batch\bios\HP" 2>NUL||Exit /B
#For /F "Tokens=2*" %%A In ('^""%__AppDir__%reg.exe" Query ^
"HKLM\Hardware\Description\system\BIOS" /V "SystemProductName" 2^>NUL^"')Do #Set "SPN=%%B"
#If Not Exist "Leg_%SPN: =_%.txt" Exit /B
#"BIOSConfigUtility64.exe" /SetConfig:"Leg_%SPN: =_%.txt" /cspwdfile:"currentpassword.bin"
#"BIOSConfigUtility64.exe" /nspwdfile:"newpassword.bin" /cspwdfile:"currentpassword.bin"
Related
I have this script that checks for a certain USB and then opens a file on it. However, now I need it to check only for the drive letter of the USB inserted so. However I don't really know how to do that and searches online returned nothing that could help me.
This is the script I have right now:
#echo off
:loop
if exist D:\ (goto Load) else (goto loop)
:Load
D:
start Loader1.exe
goto Finish
:Finish
exit
Is something like this that you are looking?
This will take over the task only on the Removable Disk and will be given the associated logical name of each for check if your file Loader1.exe is there for take next action.
See this link: How To List Drive Letters:
Value Meaning for drivetype in WMIC logicaldisk
0 Unknown
1 No root directory
2 Removable disk
3 Local disk
4 Network drive
5 Compact disk
6 RAM disk
wmic logicaldisk get caption,drivetype|find "2"
This Result Removable disk :
D: 2
E: 2
F: 2
G: 2
Caption = D:
DriveType = Removable disk == 2
After, and make sure the Loader1.exe file exist to start/run your command:
Driver:\Loader1.exe
The last part, time out (1 minute) to perform the next loop:
timeout 60 >nul && goto :loop
#echo off
:loop
for /f %%i in ('"wmic logicaldisk get caption,drivetype|find "2""')do if exist "%%~i\Loader1.exe" (
cd /d %%~i\ & start .\Loader1.exe && goto :Finish )
timeout 60 >nul & goto :loop)
:Finish
:: Or ::
#echo off
set "_cd=%cd%" && title <nul
:loop
for /f %%i in ('"wmic logicaldisk where drivetype=2 get name|find /v "Name""
')do if exist "%%~i\Loader1.exe" cd /d %%~i\ & start .\Loader1.exe & cd /d "%_cd%" & exit /b
timeout 60 >nul & goto :loop
Here's how to get the USB drive letter from any drive:
#echo off
for /F "usebackq tokens=1,2,3,4 " %%i in (`wmic logicaldisk get caption^,description^,drivetype 2^>NUL`) do (
if %%l equ 2 ( echo %%i is a USB drive. )
)
Answer is not a duplicate of #scientist_7 I got it from Find USB Drive letter.
I'm trying to write a script that parses a text file to identify removable drives by Label. The goal is to create a copy script based on the found drives.
I'm able to parse the file but I can't seem to get the second pair of IF conditions to be true.
I may be misunderstanding how variables are evaluated in each loop of the FOR.
Thoughts appreciated.
EDIT: Expanding on the original request for clarity(it was late when I asked) The expanded goal is to identify one or many target drives to copy data from an SD card. Since the drives letter allocations vary from PC to PC and depend on which is plugged in first my idea was to use the labels as somewhat identifiable values and create a simple copy string along the lines of
XCOPY SourceDrive\*.jpg DestinationDrive1\<GetDate>\
XCOPY SourceDrive\*.jpg DestinationDrive2\<GetDate>\
End Edit
#echo off
cls
title "Detecting device drive letters..."
setlocal enabledelayedexpansion
set DestinationDrive1Found=
set DestinationDrive2Found=
set SourceDriveFound=
set SourceDrive=
set DestinationDrive1=
set DestinationDrive2=
echo Detecting device drive letters...
echo list volume > %systemdrive%\ListDrives.tmp
diskpart /s %systemdrive%\ListDrives.tmp > %systemdrive%\CurrentDrives.tmp
echo Checking drive IDs
FOR /F "skip=7 tokens=2-4" %%a IN (%systemdrive%\CurrentDrives.tmp) DO (
set "matchvar=%%c"
set "comparevar=!matchvar:DRIVE=!"
IF /I NOT "!comparevar!" == "%%c" IF "!DestinationDrive1Found!" NEQ 1 (
echo Drive %%b was found to be %%c and will be DESTINATION1
set DestinationDrive1Found=1
set DestinationDrive1=%%b )
IF /I NOT "!comparevar!" == "%%c" IF "!DestinationDrive1Found!" EQU 1 ( echo Drive %%b was found to be %%c and will be DESTINATION2
set DestinationDrive2Found=1
set DestinationDrive2=%%b )
)
File I'm parsing
Microsoft DiskPart version 10.0.10586
Copyright (C) 1999-2013 Microsoft Corporation.
On computer: NEWGLOOMWIN10
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 D DVD-ROM 0 B No Media
Volume 1 E Macintosh H HFS Partition 231 GB Healthy
Volume 2 C BOOTCAMP NTFS Partition 721 GB Healthy System
Volume 3 F TEAMXCAMRAX FAT Removable 1937 MB Healthy
Volume 4 G TEAMXDRIVEX NTFS Partition 465 GB Healthy
Volume 5 H TEAMYDRIVEY NTFS Partition 931 GB Healthy
Thanks to all who responded. Had #Mofi provided an answer I would have marked that response as the answer. In the end the removal of a four quote marks and the addition of an ELSE got me the answer I was looking for.
The script below gives me exactly what I'm after.
#echo off
cls
title "Detecting device drive letters..."
setlocal enabledelayedexpansion
set DestinationDrive1Found=
set DestinationDrive2Found=
set SourceDriveFound=
set SourceDrive=
set DestinationDrive1=
set DestinationDrive2=
echo Detecting device drive letters...
echo list volume > %systemdrive%\ListDrives.tmp
diskpart /s %systemdrive%\ListDrives.tmp > %systemdrive%\CurrentDrives.tmp
echo Checking drive IDs
FOR /F "skip=7 tokens=2-4" %%a IN (%systemdrive%\CurrentDrives.tmp) DO (
set "matchvar=%%c"
set "comparevar=!matchvar:CAMRA=!"
IF /I NOT "!comparevar!" == "%%c" (#echo Drive %%b was found to be %%c and will be SOURCE
set SourceDriveFound=1
set SourceDrive=%%b)
)
echo Checking drive IDs
FOR /F "skip=7 tokens=2-4" %%a IN (%systemdrive%\CurrentDrives.tmp) DO (
set "matchvar=%%c"
set "comparevar=!matchvar:DRIVE=!"
IF /I NOT "!comparevar!" == "%%c" IF !DestinationDrive1Found! NEQ 1 (
echo Drive %%b was found to be %%c and will be DESTINATION1
set DestinationDrive1Found=1
set DestinationDrive1=%%b
) ELSE (
IF /I NOT "!comparevar!" == "%%c" IF !DestinationDrive1Found! EQU 1 ( echo Drive %%b was found to be %%c and will be DESTINATION2
set DestinationDrive2Found=1
set DestinationDrive2=%%b ))
)
If you just want to set some variables to the drives allocated to any removable drive with the string DRIVE in it's 'label' then the following may provide you with an alternative not requiring elevation.
#Echo Off
For /F "UseBackQ Skip=1 Delims=" %%A In (`WMIC LogicalDisk Where^
"DriveType='2' And VolumeName Like '%%DRIVE%%'" Get Name`
) Do For /F %%B In ("%%A") Do Set/A "i+=1"&Call Set "_drv%%i%%=%%B"
Set _drv
Timeout -1
[Edits] - an example correctly stipulating a fixed drive
#Echo Off
For /F "UseBackQ Skip=1 Delims=" %%A In (`WMIC LogicalDisk Where^
"DriveType='3' And VolumeName Like '%%DRIVE%%'" Get Name`
) Do For /F %%B In ("%%A") Do Set/A "i+=1"&Call Set "_drv%%i%%=%%B"
Set _drv
Timeout -1
An example without stipulating the type of drive, (recommended based on comments).
#Echo Off
For /F "UseBackQ Skip=1 Delims=" %%A In (
`WMIC LogicalDisk Where "VolumeName Like '%%DRIVE%%'" Get Name`
) Do For /F %%B In ("%%A") Do Set/A "i+=1"&Call Set "_drv%%i%%=%%B"
Set _drv
Timeout -1
I have recently started diving into writing Batch files and I have a question. I'm trying to create a file that checks to see if my secondary monitor is connected and than if it is switches the primary display to the secondary screen. (Yes I do know about the windows+P shortcut)...
So far I have figured out that "DisplaySwitch.exe /external" sets the default display to the secondary monitor but I cannot find out how to detect whether the display is there first.
-Cheers, Luke
With Windows 10, may be just a call to:
wmic desktopmonitor get DeviceID
output:
DeviceID
DesktopMonitor1
DesktopMonitor2
More details about monitor with :
wmic desktopmonitor get
By calling a powershell from the cmd the following will get the number of monitors:
powershell -Command "exit (Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorBasicDisplayParams | Select-String -Pattern 'InstanceName').length"
set nMons=%ERRORLEVEL%
One possible way is to use dxdiag though it is not the fastest way:
#echo off
del ~.txt /q /f >nul 2>nul
dxdiag /t ~
w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:3 >nul 2>&1
setlocal enableDelayedExpansion
set currmon=1
for /f "tokens=2 delims=:" %%a in ('find "Current Mode:" ~.txt') do (
echo Monitor !currmon! : %%a
set /a currmon=currmon+1
)
endlocal
del ~.txt /q /f >nul 2>nul
this will print the resolutions of all monitors.
Update:
dxdiag prints info about all monitors so you can check if there are more than one monitors:
#echo off
del ~.txt /q /f >nul 2>nul
start "" /w dxdiag /t ~
for /f "tokens=1* delims=:" %%a in ('find /c "Current Mode:" "~.txt"') do (
set /a "number_of_monitors=%%b"
rem echo #%%b#
)
rem exit /b 0
echo %number_of_monitors%
rem :---- if it needed -----:
if defined number_of_monitors ( if %number_of_monitors% GTR 1 ( echo second monitor connected ) else (echo only one monitor connected ))
del ~.txt /q /f >nul 2>nul
#npocmaka's answer didn't quite work for me, but this variation of his code did (Windows 10):
rem #echo off
del %TEMP%\dxdiag.txt /q /f >nul 2>nul
start "" /w dxdiag -64bit -t %TEMP%\dxdiag.txt
for /f "tokens=3" %%f in ('find /c"Monitor Name:" %TEMP%\dxdiag.txt') do set MONITOR_COUNT=%%f
if defined MONITOR_COUNT ( if %MONITOR_COUNT% GTR 1 ( echo second monitor connected ) else (echo only one monitor connected ))
del %TEMP%\monitors.txt /q /f >nul 2>nul
SET monitors=monitors.txt
SET nMons=0
MultiMonitorTool.exe /scomma "%monitors%"
FOR /F "skip=1 tokens=9 delims=," %%a IN (%monitors%) DO IF %%a GTR 0 SET /A nMons += 1
echo Number of monitors: %nMons%
MultiMonitorTool
Here is quick way to get connected monitors count via powershell
$m = Get-PnpDevice -Class Monitor -Status OK | measure; $m.Count
I need to select a disk in WinPE using DISKPART by label. I found this but I think it's outdated:
#Echo %dbg%Off
::
:: Find External drive and set it active
:: Lists Disk Information using Diskpart
::
SetLocal EnableDelayedExpansion
:: Type the frst 11 characters of the label of the drive here.
Set _FindLabel=Recovery
Call :_InitVars "%_FindLabel%"
"%SystemRoot%\system32\FSUTIL.exe">Nul 2>&1||Goto _NotAdmin
Echo.
Echo.Please wait, gathering info on the installed drives
Echo.
>"%_Dscr1%" Echo.List disk
For /F "Tokens=2" %%I In ('Diskpart /S "%_Dscr1%"^|Findstr /I /R /C:"Disk [0-9]"') Do (
(Echo.Select Disk %%I
Echo.Detail Disk)>>"%_OFile1%"
)
For /F "Tokens=1,2,3*" %%I In ('Diskpart /S "%_OFile1%"^|Findstr /I /R /C:"Disk [0-9]" /C:"Volume [0-9]"') Do (
If /I %%I==Disk (
Set _Tmp=%%J:
) Else (
Set _Label=%%L
Set _Label=!_Label:~,11!
>>"%_OFile2%" Echo.!_Tmp!%%J:!_Label!
))
If Exist "%_OFile1%" Del "%_OFile1%"
For /F "Usebackq Tokens=1-3 Delims=:" %%I In ("%_OFile2%") Do (
Set _Label=%%K
Set _Label=!_Label:~,11!
If "!_Label!"=="%_FindLabel%" (Set _Disk=%%I) & (Set _Label=%%K) & Goto _FDisk
>>"%_OFile1%" Echo.Volume %%J on Disk %%I has the Label %%K
)
Echo.
Echo.There is no drive connected that has the label of "%_FindLabel%"
Echo.These are the currently connected volumes:
Type "%_OFile1%"
:_Exit
Echo.
Pause
Goto _Cleanup
:_FDisk
(Echo.Select disk %_Disk%
Echo.Select Partition 1
Echo.Active)>"%_Dscr1%"
Diskpart /S "%_Dscr1%"
:_Cleanup
For %%I In ("%_Dscr1%" "%_OFile1%" "%_OFile2%") Do Del %%I>Nul 2>&1
Goto :EOF
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subroutines
::::::::::::::::::::::::::::::::::::::::::::::::::::::
:_NotAdmin
Ver|Findstr /I /C:"Version 5">Nul
If %Errorlevel%==0 (Set _Tmp1=5) & (Set _Tmp=a Computer Administrator account)
Ver|Findstr /I /C:"Version 6">Nul
If %Errorlevel%==0 (Set _Tmp1=6) & (Set _Tmp=an Elevated Command Prompt)
Echo.
Echo.This program must be run from %_Tmp%.
If %_Tmp1%==6 Echo.Please Right click the file, then click Run as Administrator
Echo.Exiting program
Goto _Exit
:_InitVars
For /F "Tokens=1 Delims==" %%I In ('Set _ 2^>Nul') Do Set %%I=
Set _Dscr1=%temp%\dpscr1.txt
Set _OFile1=%temp%\_OFile1.txt
Set _OFile2=%temp%\_OFile2.txt
Set _FindLabel=%~1
Set _FindLabel=%_FindLabel:~,20%
Call :_Cleanup
When I run it, it returns:
Please wait, gathering info on the installed drives
There is no drive connected that has the label of "Recovery"
These are the currently connected volumes:
Volume 1 on Disk 0 has the Label NTFS Part
Volume 2 on Disk 0 has the Label NTFS Part
Volume 3 on Disk 1 has the Label WINPE
It's showing the Fs (filesystem), not the label.
Diskpart output (list volume)
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 D USBBOOT UDF DVD-ROM 329 MB Healthy
Volume 1 Windows NTFS Partition 40 GB Healthy
Volume 2 Recovery NTFS Partition 19 GB Healthy
Volume 3 Z WINPE FAT32 Removable 7632 MB Healthy
Not sure how to modify this to get it to select the Label column.
As there is missing valid drive letter in some lines of the Diskpart output (list volume, column ltr), then tokens in line #19
For /F "Tokens=1,2,3*" %%I In ('Diskpart /S "%_OFile1%"^|Findstr /I /R /C:"Disk [0-9]" /C:"Volume [0-9]"') Do (
display as follows (and we have our culprit now):
%%I %%J %%K %%L
Volume 0 D USBBOOT UDF DVD-ROM 329 MB ...
Volume 1 Windows NTFS Partition 40 GB Healthy
Volume 2 Recovery NTFS Partition 19 GB Healthy
Volume 3 Z WINPE FAT32 Removable 7632 MB ...
Therefore you could use next snippet code (instead of lines 19..26) in your script:
For /F "Tokens=1*" %%I In ('Diskpart /S "%_OFile1%"^|Findstr /I /R /C:"Disk [0-9]" /C:"Volume [0-9]"') Do (
If /I %%I==Disk (
Set _Tmp=%%J:
) Else (
Set _Label=%%J
Set _Label=!_Label:~10,11!
>>"%_OFile2%" Echo.!_Tmp!%%J:!_Label!
))
Care this change interferes _Tmp variable!
I have a small side project I've been working on and i want to add an option to scan the computer and find which drives are connected and what they are(USB, Hard drive, Disc drive, SSD, etc.)
this is what i have so far.
echo off
:start
color 0a
cls
title Search
echo To search enter the drive and term you wish to search below.
echo ---------------------------------------------------------------------------
set inputdrive=
set /p inputdrive=Drive:
set input=
set /p input=Search:
dir %inputdrive%:\%input% /s /b
pause
echo search again?
set inputsearch=
set /p inputsearch=(Y/N)
if %inputsearch%==Y goto start
if %inputsearch%==N exit
I plan on adding an option to scan for connected drives at the beginning of the script.
You can use WMIC to get the info without the need for administrator rights.
Here is code that gives a nice listing of all available drives, including removable media drives that do not have any media installed:
#echo off
setlocal
set ^"driveTypes=^
0Unknown :^
1No Root Directory:^
2Removable Media :^
3Local Disk :^
4Network Drive :^
5CD/DVD :^
6RAM Disk :^"
echo Available Drives:
echo(
echo ID Drive Type Volume Name
echo -- ----------------- -----------
for /f "skip=1 tokens=1-3" %%A in (
'"wmic logicalDisk get DeviceID, DriveType, VolumeName"'
) do if "%%B" neq "" (
setlocal enableDelayedExpansion
for /f "delims=:" %%D in ("!driveTypes:*%%B=!") do (
endlocal
echo %%A %%D %%C
)
)
Just a bit more code will restrict the list to only drives that are available with media:
#echo off
setlocal
set ^"driveTypes=^
0Unknown :^
1No Root Directory:^
2Removable Media :^
3Local Disk :^
4Network Drive :^
5CD/DVD :^
6RAM Disk :^"
echo Available Drives:
echo(
echo ID Drive Type Volume Name
echo -- ----------------- -----------
for /f "skip=1 tokens=1-3" %%A in (
'"wmic logicalDisk get DeviceID, DriveType, VolumeName"'
) do if "%%B" neq "" dir %%A >nul 2>nul && (
setlocal enableDelayedExpansion
for /f "delims=:" %%D in ("!driveTypes:*%%B=!") do (
endlocal
echo %%A %%D %%C
)
)
fsutil fsinfo drives
fsutil fsinfo drivetype c:
But you need to have administrator rights to use it