using variables to direct label command in windows - windows

We have to set the drive label on ~800 USB drives. We have multiple Windows computers set up able to take 10 drives at a time. As there will also be some files copied, I set the drive letters once in the batch file using:
SET dest1=d:
SET dest2=e:
SET dest3=f:
SET dest4=g:
REM etc.
However, I can't seem to use
label %dest1% mylabel
Any suggestions?
Thanks!

Related

winapi to retrieve the maximum configured page file size for all drives

It appears that both GlobalMemoryStatusEx and GetPerformanceInfo Windows APIs report the current size of the page file, but the page file can be configured (per disk) to grow up to a certain limit.
Is there an API to retrieve that limit, so that I can calculate the maximum possible commit size for the whole system (provided page file settings otherwise remain unchanged)?
Seems to be possible via WMI (COM and/or command-line):
wmic pagefile list /format:list
wmic pagefileset list /format:list
But can also be done in a platform-dependent* way by reading/parsing this registry setting:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PagingFiles
As described here, this format is REG_MULTI_SZ (one line per page file):
<page-file> [<initial-size> <max-size>]
For example:
c:\pagefile.sys 1024 8192
In case of a system-managed page file the value would be:
?:\pagefile.sys
In case of system-managed the size is limited by the free space on the system drive (not entirely true for Hyper-V VMs).
* The registry setting appears to work at least in Windows XP, 7, 2012 and 10 (32/64-bit, PC).

Adding dummy Printers to Windows 7

I want to add around 40 printers to my machine in order to test the performance of the application which uses WMI for printer functions.
What I want is a way to add dummy/fake printers (Not only 1 printer but more than 1 printers) through some sort of script or programming.
Please note that I have gone through most of the options to add virtual Printer to the system but none of them says how to add Printers. Reason behind asking it to be done by script or programming is that, if I have one, I can test it on multiple machines.
Unfortunately Windows 7 does not feature the really nice Add-Printer Function Powershell introduced in Windows 8.1 but you can do this via WMI.
In VBScript some example code would look like this:
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objPrinter = objWMIService.Get("Win32_Printer").SpawnInstance_
For i = 1 to 40
name = "Testprinter" & i
objPrinter.DeviceID = name
objPrinter.Caption = name
objPrinter.DriverName = "Microsoft XPS Document Writer"
objPrinter.PortName = "XPSPort:"
objPrinter.Put_
Next
This will Create 40 Printers with the name "Testprinter" which are copies of Microsofts XPS Document Writer basically.
Please note that in the "Device and Printers" View Windows 7 would group them all together due to them having the same port, but I doubt that would influence your testing.

Assign the same Drive Letter Every Time to USB Drive with USBDLM

I try to use USBDLM to connect separately a USB sticks and a USB drive to appear always as drive T.
On every USB stich/drive I put a USBDLM.ini with:
[DriveLetters]
Letters=%drive%\usbdlm.ini
and for every drive its own configuration as:
[DriveLetters10]
; Aldistick
DeviceID1=USB 2.0 Flash Disk USB Device
Letter1=T
; many other options are documented in the Help files
[DriveLetters20]
VolumeSerial=16ED-33C5
Letter=T
But I find out that this is not working unless I put the same usbdlm.ini file for every stick/drive into the folder where USBDLM.exe is placed.
Do I something wrong?
Thanks.
On the drive you need an USBDLM.INI which contains a simple [DriveLetters] section with the desired letters:
[DriveLetters]
Letters=T
In the main USBDLM.INI you let is read the letter from the INI on the drive:
[DriveLetters]
Letters=%drive%\usbdlm.ini
Maybe it is more handy to let USBDLM extract the desired drive letter from the volume label, e.g. label it "Drive T" and write in the main USBDLM.INI:
[DriveLetters]
Letters=%LetterFromLabel%
http://www.uwe-sieber.de/usbdlm_help_e.html#by_label
Uwe Sieber

Why is my IF comparison op failing?

update SOLVED - the problem is not with my code. there is a design limitation (some might say "bug") in the command processor. the IF comparison operators do not work with values higher than 2147483648. now I just have to figure out how to strip off some of the least significant digits for the workaround. thanks to all for reading.
=======
hello out there in cyberland,
I manage a small company's network. I'm trying to set up an automated archival process using a batch file running on a server, and need a little help with the logic. I'm not a programmer and don't have the time to learn PowerShell or VBscript. I have read and re-read the MS command reference on IF, FOR, and CALL, and can not figure out what I'm doing wrong.
We have a Windows 2000 Server with two disk drives and a tape drive. One disk has a shared folder, call it Public; the other disk is not shared, call it Staging.
The Public drive will accept incoming backups from the client desktops. I need the process to move files from the Public drive to the Staging drive until the drive is too full to accept any more files, whereupon the tape backup starts. Upon completion of the tape run, the Staging drive will be emptied and the process will resume moving files from Public to Staging.
The goal is to automatically and perpetually archive the desktop backup files to tape, with no user intervention other than changing the tape.
You may ask, why involve two drives? Two reasons:
1) If the desktops back up directly to the Staging drive, at some point the client desktop backups will fail for lack of space on the target drive. I have no way to predict when this will occur; the only definable condition I can think of would be an arbitrary threshold of free disk space, but since the backup files to be archived will be different sizes, I could run into a situation where the target drive free space is above the threshold, but the next backup exceeds that space. Result: client desktop backup fails and server tape backup does not start.
2) If the Staging drive fills up and the tape backup fails for some reason (tape not changed or whatever), having the desktops back up to the Public drive buys me some time to fix the tape issue before the desktop backups begin to fail.
Here is the algorithm I'm trying to code:
1) Begin
2) Obtain free space on Staging drive
3) Obtain size of smallest file on Public drive (if no files present, exit)
4) Compare file size with free space on Staging drive
5) if file will fit, move it to Staging drive; else, exit and start Tape Backup
6) return to Begin
And here is my batch code which is not working. At this stage in testing, I have one file (8 GB) in the Public drive which will fit in the free space (32 GB) on the Staging drive. The set command confirms the variables are being set as expected; the process is failing at the statement [ if %BKFsize% LSS %DiskFree%" ]. Instead of the file being moved, the tape routine specified by 'else' is called instead:
#echo off
setlocal enableextensions enabledelayedexpansion
:Begin
REM obtain and display free space on Staging drive.
D:
for /f "tokens=3 delims= " %%A in ('dir ^| find "bytes free"') do (
set Z=%%A
set Z=!Z:,=!
)
set DiskFree=!Z!
echo.
echo D: has %DiskFree% bytes free
echo.
REM obtain sizes of files on Public drive to be moved.
E:
cd \backup.email
if not exist *.bkf exit
dir *.bkf /b /os > BKFlist.txt
for /f "tokens=*" %%G in (BKFlist.txt) do call :CheckBKF "%%G"
goto :eof
:CheckBKF
set BKFfile=%1
set BKFsize=%~z1
echo.
echo File %BKFfile% is %BKFsize% bytes
echo.
set
pause
REM move file(s) to Staging drive, space permitting; or,
REM if not enough space for smallest file, start tape backup.
if %BKFsize% LSS %DiskFree% (
echo Moving file %BKFfile% to drive D
echo.
move E:\backup.email\%BKFfile% D:\backup.email
) else (
C:\WINNT\AutoBackup\TapeBKF.cmd
exit
)
goto Begin
:End
I know this must be fairly simple but like I said, I'm not a programmer, and I bow to your superior skill. Any advice is much appreciated, and thank you.
In batch file, there is no real difference between strings and integers types, but that isn't your problem here.
The problem is that integers only works in the 32 bit signed range.
-2147483648 to 2147483647
But your filesize is greater and also your disk space.
To test this you could try to add a one.
Set /a myvar=BKFsize+1
Set /a myvar=DiskFree+1
I suppose you get an error.
You could solve it, if you try to use the string compare, currently you do a string compare but your numbers are not of the same length, so you get "unpredictable" results.
But if you adjust/filling the strings with zeros so they have the same length, it should work.
set "strBKSize=000000000000000000%bkSize%"
set "strBKSize=%strBKSize:~-15%"
set "strDisksize=000000000000000000%Disksize%"
set "strDisksize=%strDisksize:~-15%"
Or you try to calculate not with bytes, but in MB or GB, by removing 6 or 9 numbers/characters.
set BKFsizeGB=%BKFsize:~0,-9%
Then you can use them as numbers.
Maybe the values contained in your variables are not integers but strings
I suppose it's comparing: 8<3 == false

Maximum number of drives in windows?

I'm trying to figure out the available disk space programmatically in windows. For this, I need to first get a list of the available drives, then check which of those are local drives and then query the available bytes on each local drive.
I'm a bit stuck on the first part, where the API presents two functions:
GetLogicalDrives (http://msdn.microsoft.com/en-us/library/aa364972(VS.85).aspx) which gives you a DWORD with the bits set (bit 0 if drive A is present, bit 1 if drive B etc)
GetLogicalDriveStrings (http://msdn.microsoft.com/en-us/library/aa364975(VS.85).aspx) which gives you the actual strings.
Now, although I'll be using strings later on, I'd prefer using the first option for querying. However, on my system a DWORD is typedef-ed to "unsigned long", which is 4 bytes, whereas drive letters only range A-Z (26 - i think - characters). Obviously, one can define more than 26 drives on their system (however unlikely they are to do so) - so I was wondering if there was any convention for those drives. Can someone point me to a resource on this?
Thanks.
DWORD is always 4 bytes, regardless of the system (it's a Win32 type).
The maximum for drive letters in Windows is 26. Because English alphabet has only 26 letters :). However, Windows allows two ways to mount a volume:
to a drive letter
to a directory (on an NTFS volume).
You can mount one volume to multiple locations (but no more than one drive letter, IIRC). A GUI for this task is presented by Control Panel -> Administrative Tools -> Computer Management -> Disk Management.
If you want to have more than 26 drives with the additional drives being redirects to already active drives and are okay with them not working properly in most programs, then you can assign more with the following method (be warned they won't even show up in the file explorer):
subst ♪: C:\Temp\
cd /D ♪:\
and to delete them (also they aren't preserved through restarts):
subst /D ♪:
You can enumerate all volumes and their mount points as described in this article.
You could use WMI. The following WMI query should list all drives:
SELECT * FROM Win32_DiskDrive
It it not sufficient to enumerate MS-DOS drives (there can be at most 26 of them, by the way, although each can be bound twice, once globally and once locally in your session), a volume can, for example, be mounted to a directory. What you want is probably to enumerate all volumes in the system, using FindFirstVolume et al. Take a look at the associated MSDN example.

Resources