Powershell:找不到定义的类类型

Powershell: Unable to find type of class defined

提问人:Subhi Shawa 提问时间:4/6/2022 更新时间:4/6/2022 访问量:253

问:

我正在尝试使用远程计算机的 Powershell 更改屏幕分辨率。 在线搜索,找到了 PS-ChangeDisplayresolution,有人能够在 Powershell 中使用 C# 执行此操作,在我的本地计算机上运行脚本,它工作得很好,但远程运行它,然后它不起作用。 我正在寻找远程运行它的方法,偶然发现了 Start-Process 和 Invoke-Command。但是,在本地尝试时,我收到错误 无法找到类型。

将不胜感激。

$command = {

  $width = 1152
  $height = 864
  $freq = 64

#Function to update the screen resolution
 Function Set-ScreenResolution { 

 $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("user32.dll")] 
    public static extern int EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE1 devMode); 
    [DllImport("user32.dll")] 
    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, int freq) 
    { 
        DEVMODE1 dm = GetDevMode1(); 

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

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

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

            if (iRet == User_32.DISP_CHANGE_FAILED) 
            { 
                $retval = "Unable to process your request. Sorry for this inconvenience."; 
            } 
            else 
            { 
                iRet = User_32.ChangeDisplaySettings(ref dm, User_32.CDS_UPDATEREGISTRY); 
                switch (iRet) 
                { 
                    case User_32.DISP_CHANGE_SUCCESSFUL: 
                        { 
                            $retval = "Success"; 
                        } 
                    case User_32.DISP_CHANGE_RESTART: 
                        { 
                            $retval = "You need to reboot for the change to happen.\n If you feel any problems after rebooting your machine\nThen try to change resolution in Safe Mode."; 
                        } 
                    default: 
                        { 
                            $retval = "Failed to change the resolution"; 
                        } 
                } 

            } 


        } 
        else 
        { 
            $retval = "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; 
    } 
   } 
} 

'@ 


 [Resolution.PrmaryScreenResolution]::ChangeResolution($width,$height,$freq) 
 } 

 #Call the function to change the resolution with the inserted parameters
 $Test = Set-ScreenResolution -Width $width -Height $height -Freq $freq
 }

 Start-Process Powershell.exe  -ArgumentList "-NoExit -command (invoke-command - scriptblock {$command})"

 }
C# PowerShell 函数 模块 命名空间

评论

0赞 JosefZ 4/6/2022
1st 你在 ur 中混合和语法(例如,在 中看起来很奇怪)。第二次失踪。C#PowerShell$pinvokeCode$retval = "Success";C#Add-Type -TypeDefinition $pinvokeCode
0赞 Subhi Shawa 4/7/2022
首先,感谢您在这方面帮助我。我实际上忘记了$retval修改。我已将它们改回返回,但它没有产生任何错误。关于你的第二点,即使在我添加了这句话之后,我仍然有同样的错误:该函数和它本身 #call 工作正常,没有任何错误,但是当我添加 Start-Process 和 Invoke-Command 时,错误开始出现。Add-Type -TypeDefinition $pinvokeCodeUnable to find type [Resolution.PrmaryScreenResolution].

答: 暂无答案