Move pagefile from one partition to another

I've been working on getting a script created that will set the pagefile settings on all our workstations.  Workstations are Win 2K SP4 and Win XP SP2.  Current company policy:  no pagefile on C: and a pagefile set on D: (1.5 * physical memory); min and max are the same.  We have successfully set the C: (boot) pagefile to zero manually, so I don't see a reason why we can't do this via a script.  I have a script that will find the physical memory and set the page file size accordingly, but I need it to also do the following:

If the pagefile is found on the C: partition, remove from C: and create on D: partition
Max out at 4GB for the pagefile size

I work weekdays, so if I don't get the answer today, I'll be back Monday.

This is what I have so far:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
 
Set colCSItems = objWMIService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
 
Set colPageFiles = objWMIService.ExecQuery _
    ("Select * from Win32_PageFileSetting")
 
For Each objPageFile in colPageFiles
    For Each objCSItem In colCSItems
       objPageFile.InitialSize = objCSItem.TotalPhysicalMemory * 1.5 / 1048576
       objPageFile.MaximumSize = objCSItem.TotalPhysicalMemory * 1.5 / 1048576
       objPageFile.Put_
    Next
Next

Open in new window

atomiteAsked:
Who is Participating?
 
purplepomegraniteConnect With a Mentor Commented:
The attached code will do what you ask.

Note that the minimum possible pagefile size on the C (system) drive is 2Mb - it is impossible to set it below this, at least by script.  I think it is impossible to set it below this anyway.
option explicit
dim strComputer
dim blnPageFileOnD
dim lngTotalPhysicalMemory, lngPageFileSize
dim objWMI
dim colCS, objCS
dim colPF, objPF
 
strComputer = "."
blnPageFileOnD=false
Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
 
' First of all work out the desired size for the pagefile
Set colCS = objWMI.ExecQuery("SELECT * FROM Win32_ComputerSystem")
For Each objCS In colCS
	lngTotalPhysicalMemory=objCS.TotalPhysicalMemory
next
lngPageFileSize=lngTotalPhysicalMemory * 1.5 / 1048576
if lngPageFileSize>4096 then lngPageFileSize=4096 ' Limit to 4Gb
wscript.echo "Pagefile size will be: " & lngPageFileSize
	
' Now process the pagefiles
set colPF=GetObject("winmgmts:{(CreatePageFile)}").instancesof("Win32_PageFileSetting")
For Each objPF in colPF
	if lcase(left(objPF.Name, 1))="c" then
		' This pagefile is on the c: drive, so set it's size to 2, which is the minimum supported size for the c drive
		objPF.InitialSize = 2
		objPF.MaximumSize = 2
		objPF.Put_
		wscript.echo "Pagefile on C set to minimum (2Mb)"
	elseif lcase(left(objPF.Name, 1))="d" then
		objPF.InitialSize = lngPageFileSize
		objPF.MaximumSize = lngPageFileSize
		objPF.Put_
		wscript.echo "Pagefile on D set to " & lngPageFileSize
		blnPageFileOnD=true
	end if
Next
 
if not blnPageFileOnD then
	' Need to create pagefile on d drive
	wscript.echo "Creating pagefile on D drive"
	Set objWMI = GetObject("winmgmts:{(CreatePageFile)}!\\.\root\cimv2")  
	Set colPF = objWMI.Get("Win32_PageFileSetting")  
	Set objPF = colPF.SpawnInstance_(0)    
	objPF.Name = "D:\\pagefile.sys"  
	objPF.InitialSize = lngPageFileSize  
	objPF.MaximumSize = lngPageFileSize
	objPF.Put_  
end if

Open in new window

0
 
atomiteAuthor Commented:
Thanks for the reply.  I'm checking this at home, so I can't test this till I'm back in the office on Monday.

We disable the pagefile on the C: through the GUI (system properties) by selecting the C:, then selecting the No Paging File radio button.  This removes the pagefile from the C: drive as far as I know.  It does warn you about the fact that it is needed, but lets you continue without it.  Is it possible to instead of setting the size to zero (or 2), to disable the pagefile on the c:?  Is there a command to disable the pagefile on a particular drive?
0
 
purplepomegraniteCommented:
It is not possible to set the pagefile to 0 via WMI.  The properties are simply not available - see here http://msdn.microsoft.com/en-us/library/aa394245(VS.85).aspx.  I am unaware of any way around this except possibly delving into the registry.  If you change the code to anything less than 2, the settings will simply be ignored as invalid.

As a point to note, though... not having at least a small pagefile on your c: drive means that in the event of a crash, Windows cannot write a crash dump file (see here http://support.microsoft.com/kb/197379).
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
atomiteAuthor Commented:
It went great until "Creating pagefile on D drive", then:

Line:49
Char:9
Error: Value out of Range
Code: 8004102B
Source: SWbemObjectEx

This was on a text Win XP box that had a pagefile on the C: but not on the D:
0
 
atomiteAuthor Commented:
Sorry, my mistake.  I didn't have my test* box set up right.  I'll re-test in a minute.
0
 
purplepomegraniteCommented:
Hmm... what was the value of lngPageFileSize as calculated by the script?
0
 
purplepomegraniteCommented:
Ah, ok!  I tested on a WinXP virtual machine with a d drive, it worked on that ok.
0
 
atomiteAuthor Commented:
Alright, the script worked exactly as you stated.  In terms of disabling the C: drive pagefile, since you don't know of a workaround, should I maybe post another question regarding that?
0
 
purplepomegraniteCommented:
That would be best, I think, as then other people are likely to look at it and hopefully someone will have a solution.  It must be said, I do seem to remember seeing another thread on this site regarding the same issue - but I have done a couple of searches, and I can't find it at all.

My thoughts on a workaround are that it may be possible to be set to zero by modifying the registry.  I can have a look at that later, won't have time for a while though.
0
 
atomiteAuthor Commented:
Thanks for your help.  :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.