2013-03-16 25 views
7

Tôi muốn tự động thiết lập hành động mà Windows 7 thực hiện khi nắp được đóng trên máy tính xách tay của tôi, vì điều này được đặt lại qua GPO mỗi lần tôi đăng nhập.Powershell Đặt nắp Đóng Hành động

Tôi biết rằng tôi có thể sử dụng lệnh powercfg trong một kịch bản hàng loạt để đạt được điều này:

powercfg -setacvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0 
powercfg -setdcvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0 

Tuy nhiên, đây là một lý do tốt để cố gắng học tập một số PowerShell. Nỗ lực đầu tiên của tôi mất hơn 10 giây để chạy.

Làm cách nào tôi có thể cải thiện ở bên dưới, cả về thời gian chạy & về độ sạch của mã. Điều gì sẽ là cách mạnh mẽ thành ngữ để tiếp cận bên dưới?

$DO_NOTHING = 0 

$activePowerPlan = Get-WmiObject -Namespace "root\cimv2\power" Win32_PowerPlan | where {$_.IsActive} 
$rawPowerPlanID = $activePowerPlan | select -Property InstanceID 
$rawPowerPlanID -match '\\({.*})}' 
$powerPlanID = $matches[1] 

# The .GetRelated() method is an inefficient approach, i'm looking for a needle and this haystack is too big. Can i go directly to the object instead of searching? 
$lidCloseActionOnACPower = $activePowerPlan.GetRelated("win32_powersettingdataindex") | where {$_.InstanceID -eq "Microsoft:PowerSettingDataIndex\$powerPlanID\AC\{5ca83367-6e45-459f-a27b-476b1d01c936}"} 
$lidCloseActionOnBattery = $activePowerPlan.GetRelated("win32_powersettingdataindex") | where {$_.InstanceID -eq "Microsoft:PowerSettingDataIndex\$powerPlanID\DC\{5ca83367-6e45-459f-a27b-476b1d01c936}"} 

$lidCloseActionOnACPower | select -Property SettingIndexValue 
$lidCloseActionOnACPower.SettingIndexValue = $DO_NOTHING 
$lidCloseActionOnACPower.put() 

$lidCloseActionOnBattery | select -Property SettingIndexValue 
$lidCloseActionOnBattery.SettingIndexValue = $DO_NOTHING 
$lidCloseActionOnBattery.put() 

Trả lời

2

Thử tăng tốc WMI:

$class = ([wmi] '\root\cimv2\power:Win32_PowerSettingDataIndex.InstanceID="Microsoft:PowerSettingDataIndex\\{8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c}\\DC\\{5ca83367-6e45-459f-a27b-476b1d01c936}"') 
$class.SettingIndexValue = 0 
$class.Put() 
2

Thành thực mà nói, tôi không thấy bất cứ lý do tại sao bạn không nên sử dụng các công cụ mà chỉ đơn giản làm việc ...;) Anyways: khi làm việc với WMI thường là ý tưởng tốt để lọc nhiều ở bên trái như bạn có thể. Không nên tạo ra nhiều khác biệt ở đây, nhưng đôi khi sự khác biệt là rất lớn. Đây là cách tôi sẽ làm điều đó với WMI:

$Name = @{ 
    Namespace = 'root\cimv2\power' 
} 
$ID = (Get-WmiObject @Name Win32_PowerPlan -Filter "IsActive = TRUE") -replace '.*(\{.*})"', '$1' 
$Lid = '{5ca83367-6e45-459f-a27b-476b1d01c936}' 
Get-WmiObject @Name Win32_PowerSettingDataIndex -Filter "InstanceId LIKE '%$Id\\%C\\$Lid'" | 
    Set-WmiInstance -Arguments @{ SettingIndexValue = 0 } 

Có thể có cách nào tốt hơn với truy vấn WQL tiên tiến hơn, đây là gần như giống những gì bạn đã làm, chỉ chút sửa đổi.

+0

Có vẻ như anh ấy thậm chí không cần truy vấn powerettingdataindex, chỉ cần powerplan. –

2

Bit này của PowerShell thực sự thay đổi cài đặt đăng ký, nhưng nó không thay đổi cách máy tính xách tay của tôi hoạt động khi nắp được đóng. Sử dụng powercfg thực hiện điều tương tự với đối tượng WMI này.

Dường như, Nhóm phụ đăng ký PowerButtons and Lid có 2 bộ mục đăng ký khác nhau.

kịch bản này, và các lệnh giống hệt nhau trong powercfg, thay đổi Sub Nhóm này trong vòng Power Options >> Advanced Settings-Do Nothing (hoặc Sleep, hoặc Hibernate, hoặc bất cứ số tùy chọn từ 0 - 3 mà bạn thiết lập), nhưng trong các thiết lập Control Panel thực tế cho Change what the power buttons doChange what closing the lid does không bị ảnh hưởng. Đây là các thiết lập trong Control Panel thực sự ra lệnh cho các hành động, ít nhất là cho Sub Group này.

Nếu tôi sử dụng powercfg hoặc tập lệnh PS tương tự với nội dung được viết ở trên, tôi thực sự có thể Change Plan Settings để có được hành vi mong muốn làm mờ màn hình (hoặc bất kỳ thứ gì). Tôi chỉ không thể tìm thấy bất cứ điều gì sẽ làm việc cho các tiểu nhóm Power Buttons and Lid.

2

Tôi muốn làm điều tương tự và nhận được cùng một vấn đề chính xác. Cuối cùng, tôi phát hiện ra rằng bạn cần phải chèn vào dòng lệnh của bạn các khóa registry mà là vượt trội so với một trong những bạn muốn thay đổi:

powercfg -setacvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0 
powercfg -setdcvalueindex 5ca83367-6e45-459f-a27b-476b1d01c936 0 

nên trở thành:

powercfg -setacvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 5ca83367-6e45-459f-a27b-476b1d01c936 0 
powercfg -setdcvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 5ca83367-6e45-459f-a27b-476b1d01c936 0 

Chỉ cần đặt rằng trong một BAT và bạn đã sẵn sàng! Giải pháp được tìm thấy trên blog của iBoyd (iboyd.net)

1

Những gì tôi đã thấy trong Windows 8.1 là khi hành động nắp được thay đổi cho sơ đồ nguồn, thì sơ đồ nguồn đó phải là cả sơ đồ nguồn đang hoạt động và ưu tiên là. Sơ đồ nguồn đang hoạt động có thể được thiết lập bởi PowerCfg và sơ đồ nguồn điện ưu tiên có thể được thiết lập bằng cách đăng ký.

Dưới đây là một kịch bản Powershell để thay đổi chúng và hành động nắp:

#Enable High performance 
$powerScheme = "High performance" 

#Find selected power scheme guid 
$guidRegex = "(\{){0,1}[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}(\}){0,1}" 
[regex]$regex = $guidRegex 
$guid = ($regex.Matches((PowerCfg /LIST | where {$_ -like "*$powerScheme*"}).ToString())).Value 

#Change preferred scheme 
$regGuid = "{025A5937-A6BE-4686-A844-36FE4BEC8B6D}" 
$currentPreferredScheme = Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\ControlPanel\NameSpace\$regGuid -Name PreferredPlan 
if ($currentPreferredScheme.PreferredPlan -ne $guid) { 
    Set-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\ControlPanel\NameSpace\$regGuid -Name PreferredPlan -Value $guid 
    Write-Host -ForegroundColor Green "Preferred scheme successfully changed. Preferred scheme is now '$powerScheme'." 
} else { 
    Write-Host -ForegroundColor Yellow "Preferred scheme does not need to be changed. Preferred scheme is '$powerScheme'." 
} 

#Change active scheme 
$currentActiveScheme = PowerCfg /GETACTIVESCHEME 
if ($currentActiveScheme | where {$_ -notlike "*$guid*"}) { 
    PowerCfg /SETACTIVE $guid 
    Write-Host -ForegroundColor Green "Power scheme successfully changed. Current scheme is now '$powerScheme'." 
} else { 
    Write-Host -ForegroundColor Yellow "Power scheme does not need to be changed. Current scheme is '$powerScheme'." 
} 

#Do not sleep when closing lid on AC 
PowerCfg /SETACVALUEINDEX $guid SUB_BUTTONS LIDACTION 000 
Write-Host -ForegroundColor Green "No action when closing lid on AC." 
0

Tôi thấy điều này trên một trang Microsoft. Yêu cầu thỏa thuận với các điều khoản sử dụng. Làm việc cho W10.

https://gallery.technet.microsoft.com/scriptcenter/Quickly-change-the-lid-b78eb77d

lid on (sets to 'do nothing') 
lid off (sets to 'sleep') 

Các kịch bản như được xuất bản sáng nay bao gồm hai tài liệu tham khảo mã hóa cứng vào c: \ tools. Những tài liệu tham khảo này chỉ dành cho việc ghi nhật ký để bạn có thể bình luận hoặc sửa đổi chúng thành cấu trúc tệp của bạn một cách an toàn.

Các vấn đề liên quan