我正在尝试创建一个执行大量安装操作的脚本,包括执行其他文件,例如.reg文件来更新注册表。我创建了一个批处理文件来启动它,并在powershell脚本中有代码以自我提升以管理员身份运行。问题是,一旦以管理员身份运行,工作路径就是C:\ Windows \ system32,之后脚本无法归档到需要运行的其他(相对)文件。
INSTALL.BAT:
powershell InstallSteps.ps1
InstallSteps.ps1:
param([switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated)
{
# tried to elevate, did not work, aborting
}
else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}
# THIS SHOWS THE PATH IS "C:\WINDOWS\SYSTEM32"
Write-Host $pwd
# THIS FAILS, BECAUSE IT CAN'T FIND THE FILE
reg IMPORT EnableAllTrustedApps.reg
我还没有找到一种方法来传递这些相对路径进入工作路径。它似乎是" Start-Process"提升方法会丢失脚本最初所在位置的所有上下文。
答案 0 :(得分:2)
我建议始终使用此功能来调用外部事物。它比相对路径更可靠。
function Get-Script-Directory
{
$scriptInvocation = (Get-Variable MyInvocation -Scope 1).Value
return Split-Path $scriptInvocation.MyCommand.Path
}
e.g。
$script_home = Get-Script-Directory
reg.exe IMPORT "$script_home\EnableAllTrustedApps.reg"
注意 - 在3.0或更高版本中,您可以使用此新的内置变量而不是函数。
$PSScriptRoot
您可能还想尝试为-WorkingDirectory
指定Start-Process
参数,例如Start-Process -FilePath powershell.exe -verb RunAs -WorkingDirectory $PWD.Path