Führen Sie ein Skript aus, wenn der PC ein Laptop ist

Führen Sie ein Skript aus, wenn der PC ein Laptop ist

Ich habe dieses PS-Skript gefunden, das prüft, ob der PC ein Desktop oder ein Laptop ist

function Get-HardwareType {
    $hardwaretype = Get-WmiObject -Class Win32_ComputerSystem -Property PCSystemType
        If ($hardwaretype -ne 2)
        {
        return $true
        }
        Else
        {
        return $false
        }}
 
If (Get-HardwareType)
{
"$Env:ComputerName is a Desktop"
}
Else
{
"$Env:ComputerName is a Laptop"
}

Wenn das Ergebnis "Laptop" ist, muss ich diesen anderen Befehl ausführen

Add-AppxPackage -Path ".\28671Petrroll.PowerPlanSwitcher_0.4.4.0_x86__ge82akyxbc7z4.Appx"

oder es zu überspringen. Wie kann ich sie kombinieren?

BEARBEITEN:

Scheint, als ob ich eine Internetverbindung benötige, um die App vollständig zu installieren; ohne Internet startet die App nicht, solange ich die App mit einer Internetverbindung ausführe. Weiß jemand, was ich ohne Internetverbindung tun muss? Oder ist das unmöglich?

Antwort1

Hier ist eine bereinigte, besser lesbare Version Ihres Codes:

function Test-IsLaptop {
    $HardwareType = (Get-WmiObject -Class Win32_ComputerSystem -Property PCSystemType).PCSystemType
    # https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-computersystem
    # Mobile = 2
    $HardwareType -eq 2
}
 
if (Test-IsLaptop) {
  Write-Host "$Env:ComputerName is a Laptop"
  Add-AppxPackage -Path "$PSScriptRoot\28671Petrroll.PowerPlanSwitcher_0.4.4.0_x86__ge82akyxbc7z4.Appx"
} else {
  Write-Host "$Env:ComputerName is a Desktop"
}

Get-WmiObjectEdit: Es empfiehlt sich, von auf umzustellen Get-CimInstance. Der Befehl sähe in diesem Fall so aus:

$HardwareType = (Get-CimInstance -Class Win32_ComputerSystem -Property PCSystemType).PCSystemType

Und hier ist der Grund dafür:

Der große Unterschied zwischen den WMI-Cmdlets und den CIM-Cmdlets besteht darin, dass die CIM-Cmdlets WSMAN (WinRM) verwenden, um eine Verbindung zu Remotecomputern herzustellen. Auf die gleiche Weise, wie Sie PowerShell-Remotesitzungen erstellen können, können Sie mit diesen Cmdlets auch CIM-Sitzungen erstellen und verwalten.

Der große Nachteil der WMI-Cmdlets besteht darin, dass sie DCOM für den Zugriff auf Remotecomputer verwenden. DCOM ist nicht Firewall-freundlich, kann von Netzwerkgeräten blockiert werden und führt zu einigen merkwürdigen Fehlern, wenn etwas schief geht.

Quelle:https://devblogs.microsoft.com/scripting/sollte-ich-cim-oder-wmi-mit-windows-powershell-verwenden/

Antwort2

Nun, im Moment mag das wahr sein. Die Dinge ändern sich und eines Tages ist es nicht mehr wahr. Aus meiner Erfahrung, die ich seit über 20 Jahren mit dem Schreiben von Code zum Konfigurieren verschiedener Arten von PC-Hardware gemacht habe, weiß ich, dass es sich auszahlt, so gründlich wie möglich zu sein. Ich versuche nur, Ihnen später Ärger zu ersparen.

Schauen Sie sich die verschiedenen Gehäusetypen unter dieser URL an. Alle diese könnten potenziell von einem Laptop gemeldet werden: Portable (8), Laptop (9), Notebook (10), Subnotebook (14)

https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-systemenclosure

Antwort3

Ihr Programm beweist nicht, dass es sich um einen Desktop handelt, es ermittelt lediglich, ob das System ein Laptop ist oder nicht. Sie gehen davon aus, dass ein System das eine oder das andere sein muss, was falsch ist. Wir leben im Zeitalter des Internets der Dinge mit eingebetteten Geräten, Servern, Workstations und Desktops zusätzlich zu Laptops. Gehen Sie niemals von Annahmen aus.

Hier sind die möglichen Werte:

AppliancePC 6
System ist ein Appliance-PC

Desktop 1
System ist ein Desktop

EnterpriseServer 4
System ist ein Enterprise Server

Maximal 8
Maximaler Enumerationswert

Mobile 2
System ist ein mobiles Gerät

PerformanceServer 7
System ist ein Performance-Server

SOHOServer 5
System ist ein Small Office und Home Office (SOHO) Server

Nicht angegeben 0
Der Systemtyp ist nicht angegeben

Workstation 3
System ist eine Workstation

Versuche dies:

Function IsLaptop
{
    $isLaptop = $false
    if(Get-WmiObject -Class win32_systemenclosure | 
        Where-Object { $_.chassistypes -eq 8 -or $_.chassistypes -eq 9 -or $_.chassistypes -eq 10 -or $_.chassistypes -eq 14 -or $_.chassistypes -eq 30})
        { $isLaptop = $true }
    Return $isLaptop
}

If (IsLaptop) {"This is a laptop"} Else {"This is not a laptop."}

verwandte Informationen