我正在尝试从提升的 PowerShell/ISE/pwsh/VSCode 实例启动一个新的、非提升的
powershell.exe -NoProfile
实例,但还没有找到一种方法来传递 -NoProfile
开关,从而导致使用自定义颜色/布局的控制台,通常在资源管理器窗口(例如蓝色 PowerShell 控制台窗口)中双击 powershell.exe 时使用。
runas.exe /trustlevel:0x20000 powershell.exe
Start-Process $env:SystemRoot\explorer.exe $PSHome\powershell.exe
runas.exe /trustlevel:0x20000 powershell.exe
那么可靠
runas.exe /trustlevel:0x20000 "powershell.exe -NoProfile"
runas.exe /trustlevel:0x20000 "explorer.exe powershell.exe -NoProfile"
[System.Diagnostics.Process]::new()
和 [System.Diagnostics.ProcessStartInfo]::new()
进行各种组合和重载,但没有成功。start /b "" xyz
但没有成功。
编辑注册表来修改默认控制台布局/颜色并非不可能,但这不是最实用的解决方案。 还有其他更好的方法吗?
控制台 (conhost.exe
) 窗口的
startup窗口标题决定要应用哪些设置,取自注册表项
[HKEY_CURRENT_USER\Console\<transformed-exe-path>]
,其中 <transformed-exe-path>
是带有 \
的可执行文件的完整路径字符替换为 _
,详见此答案。
使用
runas.exe /trustlevel:0x20000
,您将获得一个自定义窗口标题,它总是附加以下内容到启动命令行:(running as <computer>\<user> with restricted privileges)
- 并且因为这样的标题不太可能在[HKEY_CURRENT_USER\Console]
中具有特定的子项,应用默认控制台设置。
解决此问题的最简单方法是通过
cmd /c start
调用以启动 new 窗口 - 要么依赖新窗口的目标可执行文件的路径来选择正确的设置,要么通过指定显式启动标题:
runas /trustlevel:0x20000 'cmd /c start powershell.exe -noprofile'
注:
这将创建两个控制台窗口:一个用于cmd /c
的
瞬态,以及由
start
创建的目标窗口 - 希望瞬态窗口的持续时间太短,无法产生视觉影响。
在 Windows 11 中,至少版本 22H2 之前,目前存在 a bug,它会阻止使用
/trustlevel
,而无需为当前计算机提供 /machine
参数 architecture:
runas "/machine:$($env:PROCESSOR_ARCHITECTURE.ToLower())" /trustlevel:0x20000 'cmd /c start powershell.exe -noprofile'
如果您需要为
start
启动的进程指定显式窗口标题,事情会变得棘手,因为该标题必须被 "..."
括起来,这是由于长期存在的 PowerShell 在传递参数方面的错误嵌入 "
字符。到外部程序(参见这个答案) - 必须手动转义为\"
;例如,设置自定义标题 Custom Title
:
# A solution that works in v7.3+ too
& {
$PSNativeCommandArgumentPassing = 'Legacy'
# Note: /machine argument omitted for brevity.
runas /trustlevel:0x20000 'cmd /c start \"Custom Title\" powershell.exe -noprofile'
}