I was asked by a client's IT admin to "write a powershell script that sets the resolution manually on bootup". Presumably it is possible if they're asking me to do this. I have absolutely no experience with powershell. My scripts/commands and their errors are as follows:

Set-DisplayResolution -Width 1024 -Height 768

Set-DisplayResolution is not recognized as the name of a cmdlet, function, script file, or operable program.

Set-ScreenResolution -Width 1024 -Height 768

Set-ScreenResolution is not recognized as the name of a cmdlet, function, script file, or operable program.

SetDisplayResolution -Width 1024 -Height 768

SetDisplayResolution is not recognized as the name of a cmdlet, function, script file, or operable program.

What am I missing? Thank you.

enter image description here

  • 3
    Please don’t include answers in questions.  Post your answer as an answer and edit it out of the question. Jan 24, 2020 at 4:33
  • 1
    Set-DisplayResolution is a commandlet from the ServerCore PowerShell module and seems not to be available on Windows 10.
    – CodeFox
    Dec 8, 2020 at 17:25
  • 1
    Can confirm what @CodeFox said. Running Set-DisplayResolution -Width 1024 -Height 768 on Windows Server 2019 worked out of the box.
    – Jaakko
    Jan 3, 2021 at 9:21

4 Answers 4


Not sure where you got your example from but in a native powershell there is no command to set the resolution.

I use AutoHotKey. You can build your own script there or use an example from the net.

Or you could write your own function, that can be called from powershell: see here

And of course there are several 3rd party tools depending on your requirements. Here's one example that works with a script as well or here are 7 others. What exactly are you trying to do?

  • I'm trying to have the resolution set automatically when the machine boots (I realize the resolution should persist through a power cycle and/or is hardware-dependent, but just accept this as presupposition for the given scenario).
    – A__
    Oct 17, 2019 at 18:05
  • @A__ how many screens?
    – Albin
    Oct 17, 2019 at 18:06
  • How would that powershell function you linked be organized? Would I put that inside a ps1 script, followed by the actual call to it (Set-ScreenResolution -Width 1024 -Height 768) inside the script as well?
    – A__
    Oct 17, 2019 at 18:07
  • one 4k display ////
    – A__
    Oct 17, 2019 at 18:07
  • 1
    @A__ as shown in the paramter definition param() would have guessed Set-ScreenResolution 1024 768 but I'm propable wrong since the script says in it's example it should be Set-ScreenResolution -Width 1024 -Height 768. Haven't used my own function in powershell for quite a while, I'm propable mistaken, just in case: try both! ;)
    – Albin
    Oct 17, 2019 at 18:20

Per Albin's answer:

Make a setResolution.ps1 file with the following contents (src):

Function Set-ScreenResolution { 

        Sets the Screen Resolution of the primary monitor 
        Uses Pinvoke and ChangeDisplaySettings Win32API to make the change 
        Set-ScreenResolution -Width 1024 -Height 768         
param ( 
           Position = 0)] 

           Position = 1)] 

$pinvokeCode = @" 

using System; 
using System.Runtime.InteropServices; 

namespace Resolution 

    public struct DEVMODE1 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
        public string dmDeviceName; 
        public short dmSpecVersion; 
        public short dmDriverVersion; 
        public short dmSize; 
        public short dmDriverExtra; 
        public int dmFields; 

        public short dmOrientation; 
        public short dmPaperSize; 
        public short dmPaperLength; 
        public short dmPaperWidth; 

        public short dmScale; 
        public short dmCopies; 
        public short dmDefaultSource; 
        public short dmPrintQuality; 
        public short dmColor; 
        public short dmDuplex; 
        public short dmYResolution; 
        public short dmTTOption; 
        public short dmCollate; 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
        public string dmFormName; 
        public short dmLogPixels; 
        public short dmBitsPerPel; 
        public int dmPelsWidth; 
        public int dmPelsHeight; 

        public int dmDisplayFlags; 
        public int dmDisplayFrequency; 

        public int dmICMMethod; 
        public int dmICMIntent; 
        public int dmMediaType; 
        public int dmDitherType; 
        public int dmReserved1; 
        public int dmReserved2; 

        public int dmPanningWidth; 
        public int dmPanningHeight; 

    class User_32 
        public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode); 
        public static extern int ChangeDisplaySettings(ref DEVMODE1 devMode, int flags); 

        public const int ENUM_CURRENT_SETTINGS = -1; 
        public const int CDS_UPDATEREGISTRY = 0x01; 
        public const int CDS_TEST = 0x02; 
        public const int DISP_CHANGE_SUCCESSFUL = 0; 
        public const int DISP_CHANGE_RESTART = 1; 
        public const int DISP_CHANGE_FAILED = -1; 

    public class PrmaryScreenResolution 
        static public string ChangeResolution(int width, int height) 

            DEVMODE1 dm = GetDevMode1(); 

            if (0 != User_32.EnumDisplaySettings(null, User_32.ENUM_CURRENT_SETTINGS, ref dm)) 

                dm.dmPelsWidth = width; 
                dm.dmPelsHeight = height; 

                int iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_TEST); 

                if (iRet == User_32.DISP_CHANGE_FAILED) 
                    return "Unable To Process Your Request. Sorry For This Inconvenience."; 
                    iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY); 
                    switch (iRet) 
                        case User_32.DISP_CHANGE_SUCCESSFUL: 
                                return "Success"; 
                        case User_32.DISP_CHANGE_RESTART: 
                                return "You Need To Reboot For The Change To Happen.\n If You Feel Any Problem After Rebooting Your Machine\nThen Try To Change Resolution In Safe Mode."; 
                                return "Failed To Change The Resolution"; 


                return "Failed To Change The Resolution."; 

        private static DEVMODE1 GetDevMode1() 
            DEVMODE1 dm = new DEVMODE1(); 
            dm.dmDeviceName = new String(new char[32]); 
            dm.dmFormName = new String(new char[32]); 
            dm.dmSize = (short)Marshal.SizeOf(dm); 
            return dm; 


Add-Type $pinvokeCode -ErrorAction SilentlyContinue 

Set-ScreenResolution -Width 1024 -Height 768

Then the file can be executed from powershell as follows


You need to install the DisplaySettings module from Powershell-Gallery to get this function.

Copy and Paste the following command to install this package using PowerShellGet

Install-Module -Name DisplaySettings
  • Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
    – Community Bot
    Apr 26 at 9:39

The powershell script from Albin's post was working OK - but on one machine only let me set 1920x1080 and not 1920x1200 which I was able to do manually. In the end I had to use Nirsoft MultiMonitor which lets you save and load profiles. I was able to edit the config file and just put in the resolution parameters and it is working quite nicely. The config file looks like this :


While I prefer to avoid third party tools where possible, on this occasion its free, lightweight and just works very well (and didn't complain about any virus)...

  • 1
    Note: This may look like a spam but it isn't, I checked it. Feb 14 at 12:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.