if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { write-error "You must run this script from an Administrator PowerShell instance"; return } $UsbstorControlRegKey = "HKLM:\SYSTEM\CurrentControlSet\Control\usbstor" $DisableSuspendOnIdleBitmask = 0x400 $drives = @(gwmi win32_diskdrive) $usbstor = @(gwmi win32_pnpentity | ? {$_.service -eq "usbstor"} | %{ $u = $_ $drives | %{ if ($u.DeviceId.Contains($_.SerialNumber)) { $u | add-member -name UsbDiskFriendlyName -value $_.Caption -MemberType NoteProperty -Passthru return # "break" out of inner foreach } } if (-not ($u | get-member UsbDiskFriendlyName)) { $u | add-member -name UsbDiskFriendlyName -Value "(No friendly name)" -MemberType NoteProperty -Passthru } } | %{ $_ | add-member -name VidPidHwid -Value $_.HardwareID[1] -MemberType NoteProperty -Passthru } | %{ $vidPidCompact = $_.VidPidHwid -replace "USB\\VID_|&PID_", "" $_ | add-member -name VidPidRegKey -Value ("$UsbstorControlRegKey\$vidPidCompact") -MemberType NoteProperty -Passthru } | %{ if (-not (test-path $_.VidPidRegKey) ` -or -not (get-itemproperty $_.VidPidRegKey | get-member DeviceHackFlags -ErrorAction SilentlyContinue)) { $_ | add-member -name RegValueOrZero -Value 0 -MemberType NoteProperty -Passthru } else { $_ | add-member -name RegValueOrZero -Value ((get-itemproperty $_.VidPidRegKey).DeviceHackFlags) -MemberType NoteProperty -Passthru } } | % { if ($_.RegValueOrZero -bAnd $DisableSuspendOnIdleBitmask) { $_ | add-member -name SuspendOnIdle -Value "Disabled" -MemberType NoteProperty -Passthru } else { $_ | add-member -name SuspendOnIdle -Value "Enabled" -MemberType NoteProperty -Passthru } } | % -Begin { $i = 1 } { $_ | add-member -name i -Value $i -MemberType NoteProperty -Passthru $i++ } | select DeviceId, UsbDiskFriendlyName, VidPidHwid, VidPidRegKey, RegValueOrZero, SuspendOnIdle, i) if ($usbstor.count -eq 0) { write-error "No usbstor devices found "; return} function FinalActions($usbstor) { # Do everything after the point where input is required in this function. # Therefore the last line of the script can be the one that gets input. # Therefore the whole script can be pasted. $i = $input | select -first 1 $usbstor = @($usbstor | ? {$_.i -eq $i}) if ($usbstor.count -ne 1) { write-error "Invalid input: $i"; return } $usbstor | %{ if (-not (test-path $_.VidPidRegKey)) { mkdir $_.VidPidRegKey | out-null } Set-ItemProperty -Path $_.VidPidRegKey -Name DeviceHackFlags -Value ($_.RegValueOrZero -bXor $DisableSuspendOnIdleBitmask) -Type DWord if ($_.SuspendOnIdle -eq "Disabled") { $_.SuspendOnIdle = "Enabled" } else { $_.SuspendOnIdle = "Disabled" } $_ } | ft -auto i, UsbDiskFriendlyName,SuspendOnIdle, VidPidHwid } $usbstor | ft -auto i, UsbDiskFriendlyName, SuspendOnIdle, VidPidHwid Read-Host "Toggle SuspendOnIdle on which USB drive number (1-$($usbstor.count))?" | . FinalActions -usbstor:$usbstor