Я создаю локальный загрузчик модуля PowerShell script. Модуль и script хранятся в общем сетевом ресурсе. script вызывается с помощью:
& '\\net\DSFShare\Shared Data\Powershell Modules\Install-MyModuleManager.ps1'
Он копирует script в папку стандартных модулей профиля, затем запускает Install.ps1 из папки модуля. Install.ps1
при необходимости поднимается. Перед закрытым окном красная ошибка появляется, но окно слишком быстро закрывается, чтобы увидеть ошибку. Как узнать, что такое ошибка?
Загружающий script вызывает установщик, используя:
$installerPath = [IO.Path]::Combine($LocalModulePath, 'Install.ps1')
Write-Host "Installer path: $installerPath"
if (Test-Path $installerPath) {
Write-Host 'Install.ps1 exists. Running Install.ps1'
& $installerPath
}
Обратите внимание: если из PowerShell я заполняю $installerPath
и вызываю его с помощью & $installerPath
, я не вижу ошибки.
Я проверил журналы событий приложений, системы, Windows PowerShell и Security, и никаких ошибок, связанных с этим, нет.
Все script - это создание источника события. Если вы хотите запустить его, вы можете использовать:
Remove-EventLog -Source 'My.Module.Manager'
затем, чтобы удалить его. Здесь script:
Write-Host "Installing module..."
$eventSource = 'My.Module.Manager'
try {
$sourceExists = [System.Diagnostics.EventLog]::SourceExists($eventSource)
} catch [Security.SecurityException] {
Write-Verbose "Caught 'SecurityException': $_.Exception.Message"
}
if ($sourceExists) {
Write-Host "...installation complete..."
} else {
#region ----- Ensure-ProcessIsElevated -----
if ($Verbose) {
$VerbosePreference = "Continue"
}
if ($Debug) {
$DebugPreference = "Continue"
}
Write-Debug "Command line is ___$($MyInvocation.Line)___"
Write-Verbose "Entering script body"
if ($ScriptPath) {
Set-Location $ScriptPath
Write-Verbose "Working directory: $pwd"
}
If (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Warning "This script must be run with elevated privileges."
Write-Warning "Restarting as an elevated process."
Write-Warning "You will be prompted for authorization."
Write-Warning "You may click 'No' and re-run manually, if you prefer."
If ((Get-WmiObject Win32_OperatingSystem | select BuildNumber).BuildNumber -ge 6000) {
Write-Verbose "This is a UAC-enabled system. Elevating ..."
$CommandLine = "$($MyInvocation.Line.Replace($MyInvocation.InvocationName, $MyInvocation.MyCommand.Definition)) -ScriptPath $pwd"
Write-Verbose "CommandLine: $CommandLine"
Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList "$CommandLine"
} else {
Write-Verbose "The system does not support UAC: an elevated process cannot be started."
Write-Warning "This script requires administrative privileges. Please re-run with administrative account."
}
Break
}
Write-Verbose "The script is now running with elevated privileges."
#endregion ----- Ensure-ProcessIsElevated -----
New-EventLog -LogName Application -Source $eventSource
Write-Host "...installation complete..."
}
Я использую PowerShell 4.0, но там нет тега.