如何在保持环境不变的情况下在单独的窗口中启动另一个PowerShell会话?

问题描述 投票:0回答:2

在 PowerShell 中工作时,我倾向于通过键入快速切换到管理模式

Start-Process wt -Verb runas

当我这样做时,会出现一个新窗口(遗憾的是,Windows 中没有

sudo
)。然而,在新的会议中,环境是全新的。在跳转到新窗口时是否可以保留变量、别名、工作目录和所有其他类似内容?如果没有,那么,这是一个有效的答案。


举个例子,我正在寻找这种行为:

第一个窗口

C:\test> $x = 123
C:\test> Start-Process wt

新窗口

C:\test> $x
123
windows powershell windows-terminal
2个回答
2
投票

根据设计,提升的会话 (

-Verb RunAs
) 继承调用者的环境变量

此外,无论您是否使用

-Verb RunAs
,当您启动另一个 PowerShell 进程(例如使用 Start-Process)时, 会话的状态(别名、函数、当前位置...)都不会被继承。


您可以根据调用者状态的值,通过在提升的会话中执行的命令显式地、有选择地重新定义感兴趣的状态来解决该问题,但这非常麻烦并且有局限性,如以下示例所示:

# Define a few things to copy to the elevated session. $x1 = 123 $x2 = '3" of snow' # !! See the caveat re regular variables below. $env:foo = 1 $env:foo2 = 2 Set-Alias bar Get-Date function baz { "hello, world" } # Note: The following only copies the definitions above. # You could try to copy ALL such definitions, by omitting a target name / pattern: # Get-ChildItem env: # Get-ChildItem function: # Get-ChildItem alias: # CAVEAT: This will NOT generally work with *regular variables*. Start-Process -Verb RunAs powershell @" -NoExit -Command Set-Location -LiteralPath \"$((Get-Location -PSProvider FileSystem).ProviderPath)\" $(Get-Variable x? | ForEach-Object { "`${$($_.Name)} = $(if ($_.Value -is [string]) { "'{0}'" -f ($_.Value -replace "'", "''" -replace '"', '\"') } else { $_.Value }); " }) $(Get-ChildItem env:foo* | ForEach-Object { "Set-Item \`"env:$($_.Name)\`" \`"$($_.Value -replace '"', '\"\"')\`"; " }) $(Get-ChildItem function:bar | ForEach-Object { "`$function:$($_.Name) = \`"$($_.Definition -replace '"', '\"\"')\`"; " }) $(Get-ChildItem alias:baz | ForEach-Object { "`$alias:$($_.Name) = \`"$($_.Definition)\`"; " }) "@

重要

  • 我省略了对 Windows 终端 (

    wt.exe

    ) 的调用,因为这会创建 
    另一个 PowerShell 会话,这意味着只会为 that 会话保留以下定义:

      环境变量。
    • 当前位置(工作目录),
    • IF其默认 shell 配置为使用父进程的工作目录。或者,更可预测的是,传递工作目录。明确使用 -d
       选项:

      wt.exe -d \"$((Get-Location -PSProvider FileSystem).ProviderPath)\"
      
      
    • 如果这足够了,您可以删除保留别名、函数和常规变量的命令,将
    • -WindowStyle Hidden
       添加到 
      Start-Process
      ,在参数列表中删除 
      -NoExit
       之前的 
      -Command
      ,并添加 
      wt.exe
       调用在底部。
  • 保留其他类型的定义需要直接在提升的

    powershell

     会话中工作,但是,该会话总是使用 
    regular (conhost.exe
    ) 控制台窗口。

一般来说,最好将在常规会话和提升会话中都可用的定义放在您的

$PROFILE

 文件
中。

作为补充,请参阅

这个答案以获取便利功能Enter-AdminPSSession

,它允许您传递一个脚本块以在提升的会话中执行,您可以将调用者状态中的值作为参数传递给该脚本块。

注:


-1
投票
您无法保留变量,创建新窗口后您将立即丢失它们,您能做的最好的事情是创建一个包含所有活动的脚本,然后将其保存在同一工作目录中。

当您打开新窗口时,只需调用脚本即可为您提供与其他窗口中相同的信息。

© www.soinside.com 2019 - 2024. All rights reserved.