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

  • 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

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

Module Installation

Install-Module -Name DisplaySettings


Set-DisplayResolution -Width 800 -Height 600
  • Tried so many methods, this one works great!
    – thevoipman
    Apr 30 at 19:09
  • This works greats with graphics modes that are reconised, but not with other graphics modes... Is there a way to create a new DisplayResolution? Oct 31 at 10:30

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


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)...

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .