Powershell获取调用脚本的$ myIvocation

时间:2014-03-12 23:30:49

标签: powershell

我正在尝试创建一个Elevate函数来提升调用该函数的脚本 然而,当它的当前形式中的函数工作时,我试图通过删除调用参数并使函数通过使用范围自动确定信息来使其更加优雅。

这是目前的作品

Function Elevate ($Invocation)
{
    $myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
    $myWindowsPrincipal=New-Object System.Security.Principal.WindowsPrincipal($myWindowsID)
    $adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
    if (-not $myWindowsPrincipal.IsInRole($adminRole))
    {
        $newProcess = New-Object System.Diagnostics.ProcessStartInfo "Powershell";
        $newProcess.Arguments = $Invocation.MyCommand.Definition
        $newProcess.Verb = "runas";
        [System.Diagnostics.Process]::Start($newProcess);
        exit;
    }
}

如果可能,我想取消$ Invocation变量。 有没有办法从父母那里得到这个?

提前致谢

2 个答案:

答案 0 :(得分:0)

Get-PSCallStack命令可能会帮助您。倒数第二个CallStackFrame将是您的调用者。该对象有各种信息:

57> function foo { (Get-PSCallStack) | Select -Last 2 -Skip 1 }
58> foo 12

Command                             Arguments                           Location
-------                             ---------                           --------
foo                                 {12}                                <No file>

如果检查返回的对象,它也有一个InvocationInfo属性。

答案 1 :(得分:0)

我弄清楚我做错了什么并修改了这个函数,它现在可以在没有明确地将$ Myinvocation传递给函数的情况下工作

我使用Script:scope从父级中获取$ MyInvocation的值。

事实证明,我第一次这样做时,我尝试使用$ Script.Myinvocation,这当然没有用。

这是工作职能。

# Elevate.ps1

Function Elevate
{
    $myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
    $myWindowsPrincipal=New-Object System.Security.Principal.WindowsPrincipal($myWindowsID)
    $adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
    if (-not $myWindowsPrincipal.IsInRole($adminRole))
    {
        $newProcess = New-Object System.Diagnostics.ProcessStartInfo "Powershell";
        $newProcess.Arguments = $Script:MyInvocation.MyCommand.Definition;
        $newProcess.Verb = "runas";
        [System.Diagnostics.Process]::Start($newProcess);
        exit;
    }
}

一个简短的测试脚本

# TestElevate.ps1

. .\Elevate.ps1
Elevate

# Whatever code you want executed in Elevated mode would go here
Write-Host "Elevate done"
sleep -s 2