Set-RunOnce запустить файл ps1 от изменения буквы USB-диска - PullRequest
0 голосов
/ 28 мая 2019

Поэтому я использую этот скрипт Powershell: Set-RunOnce https://www.powershellgallery.com/packages/WindowsImageConverter/1.0/Content/Set-RunOnce.ps1

Когда я жестко закодировал буклет диска (E: \ ServerInstall.ps1), он работает как шарм.Но я хочу быть уверен, что этот скрипт может запускаться с любой буквы диска, к которому подключен USB .

Как я могу получить эту изменяющуюся букву диска в реестре?

Сначала я попробовал это с -ExecutionPolicy Bypass , но это тоже не сильно изменилось.

Я также попробовал это:

$ getusb = Get-WmiObject Win32_Volume -Filter "DriveType = '2'".. \ Set-RunOnce.ps1 Set-RunOnce -Command

'% systemroot% \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe `-ExecutionPolicy Unrestricted -File $ getusb.Name \ ServerInstall.ps1'

-> $ getusb.Name \ ServerInstall.ps1 перестали жестко кодироваться в реестре, но он не знал, что такое $ getusb.name, поэтому скрипт не запустился.

. .\Set-RunOnce.ps1
Set-RunOnce -Command '%systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe `
-ExecutionPolicy Unrestricted -File (wmic logicaldisk where drivetype=2)
ServerInstall.ps1'

1 Ответ

0 голосов
/ 28 мая 2019

Функция Set-RunOnce действительно проста для понимания и проста в настройке.
Я бы предложил создать собственную производную функцию, чтобы делать то, что вы хотите, и использовать вместо этого:

function Set-RunOnceForUSB {
    # get the driveletter from WMI for the first (possibly only) USB disk
    $firstUSB   = @(Get-WmiObject -Class Win32_LogicalDisk | Where-Object {$_.DriveType -eq 2} | Select-Object -ExpandProperty DeviceID)[0]
    # or use:
    # $firstUSB = @(Get-WmiObject Win32_Volume -Filter "DriveType='2'" | Select-Object -ExpandProperty DriveLetter)[0]

    # combine that with the name of your script file to create a complete path
    $scriptPath = Join-Path -Path $firstUSB -ChildPath 'ServerInstall.ps1'

    # create the command string. use double-quotes so the variable $scriptPath gets expanded
    $command = "%systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -File $scriptPath"

    # next, add this to the registry same as the original Set-RunOnce function does
    if (-not ((Get-Item -Path HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce).Run )) {
        New-ItemProperty -Path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce' -Name 'Run' -Value $command -PropertyType ExpandString
    }
    else {
        Set-ItemProperty -Path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce' -Name 'Run' -Value $command -PropertyType ExpandString
    }
}
...