8

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

A__
  • 477

4 Answers4

16

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

Module Installation

Install-Module -Name DisplaySettings

Usage

Set-DisplayResolution -Width 800 -Height 600
3

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?

Albin
  • 11,950
3

Per Albin's answer:

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

Function Set-ScreenResolution {

<# .Synopsis Sets the Screen Resolution of the primary monitor .Description Uses Pinvoke and ChangeDisplaySettings Win32API to make the change .Example Set-ScreenResolution -Width 1024 -Height 768
#> param ( [Parameter(Mandatory=$true, Position = 0)] [int] $Width,

[Parameter(Mandatory=$true, Position = 1)] [int] $Height )

$pinvokeCode = @"

using System; using System.Runtime.InteropServices;

namespace Resolution {

[StructLayout(LayoutKind.Sequential)] 
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 
{ 
    [DllImport(&quot;user32.dll&quot;)] 
    public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode); 
    [DllImport(&quot;user32.dll&quot;)] 
    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 &quot;Unable To Process Your Request. Sorry For This Inconvenience.&quot;; 
            } 
            else 
            { 
                iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY); 
                switch (iRet) 
                { 
                    case User_32.DISP_CHANGE_SUCCESSFUL: 
                        { 
                            return &quot;Success&quot;; 
                        } 
                    case User_32.DISP_CHANGE_RESTART: 
                        { 
                            return &quot;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.&quot;; 
                        } 
                    default: 
                        { 
                            return &quot;Failed To Change The Resolution&quot;; 
                        } 
                } 

            } 


        } 
        else 
        { 
            return &quot;Failed To Change The Resolution.&quot;; 
        } 
    } 

    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 [Resolution.PrmaryScreenResolution]::ChangeResolution($width,$height) }

Set-ScreenResolution -Width 1024 -Height 768

Then the file can be executed from powershell as follows

`C:\path-to-file\setResolution.ps1`
A__
  • 477
0

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 :

Name=\\.\DISPLAY1
Width=1920
Height=1200

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

Toto
  • 19,304