使用 Windows Terminal (1)

作者: zsh2517 分类: 技术 发布时间: 2020-04-03 15:12

安装 Windows Terminal

Windows 10 的应用商店中,搜索 Windows terminal,然后有一个叫做 Windows terminal (Preview) 的程序。安装即可。
启动的话,开始菜单里面可以直接找到 Windows terminal (Preview) 这个工具。或者 Win + R 运行 wt
gcm wt / Get-Command wt可以看到它的位置,是C:\Users\UserName\AppData\Local\Microsoft\WindowsApps\wt.exe

PS C:\Users\UserName> gcm wt

CommandType  Name    Version  Source
-----------  ----    -------  ------
Application  wt.exe  0.0.0.0  C:\Users\UserName\AppData\Local\Microsoft\WindowsApps\wt.exe

添加到右键菜单

在任意文件夹下,按着 Shift 鼠标右键,有 在此处打开Powershell/命令行/cmd/命令提示符 的选项。那么,如何把 Windows Terminal 添加到右键菜单呢?

注册表添加项目

注册表 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell 这个位置中,存储了文件夹右键所有项目的信息。之后新建一个项,比如叫做term(随意,但是不能和已有的冲突),之后在这个项下面再新建一个项 command。双击 command 右侧的 (默认) 项,将上面 wt 的位置粘贴过去。这个时候,切换到比如桌面,然后右键找到 Windows terminal 菜单,如果没有问题的话,应该是可以打开了。(位置不是当前目录没事,后面会设置)

如果需要更改显示的名称,比如 cmd - Windows Terminal powershell - Windows Terminal,在 Shell 下的开始创建的 term 的右侧更改 (默认) 的值,比如改成 PowerShell - Windows Terminal

默认隐藏,按着Shift 加载

term 项右侧,新建一个字符串值,名称为 Extended,值不需要填,之后换到桌面,再试一下,应该是已经隐藏了。然后按着 Shift 右键,可以显示出来。

设置图标

term 项右侧,新建一个字符串值,名称为 Icon,值填写一个图标的地址,例如 %USERPROFILE%\AppData\Local\terminal\wt_32.ico(这个是自己创建的)
之后右键这一项就有图标了。

从当前位置运行

编辑 Windows Terminal 的配置项(程序标题栏有倒 ^ 的一个按钮,里面有 Settings 设置)
profiles 找到默认运行的 Shell 节点,向这里面添加一项

"startingDirectory": null

取消运行目录的设置。
这个时候,再试一下运行 wt (比如从资源管理器地址栏或者右键运行),会以当前目录打开。
除了右键菜单,在 资源管理器/explorer 下,Ctrl+L 编辑任务栏直接输入 wt 就可以打开 Windows Terminal

添加 UAC 权限运行

之前有一种cmd脚本,是自动申请以UAC权限运行。代码如下

@echo off
rem echo 获取Administrator权限
cacls.exe "%SystemDrive%\System Volume Information" >nul 2>nul
if %errorlevel%==0 goto Admin
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
echo Set RequestUAC = CreateObject^("Shell.Application"^)>"%temp%\getadmin.vbs"
echo RequestUAC.ShellExecute "%~s0","","","runas",1 >>"%temp%\getadmin.vbs"
echo WScript.Quit >>"%temp%\getadmin.vbs"
"%temp%\getadmin.vbs" /f
if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"
exit
:Admin
echo 成功取得Administrator权限

阅读代码可以看到其原理,实际上是调用了一段 vbs,通过 vbs 运行,VBS 代码如下

Set RequestUAC = CreateObject("Shell.Application")
RequestUAC.ShellExecute "%~s0","","","runas",1
WScript.Quit

即创建一个 Shell.Application 的对象,然后 RequestUAC.ShellExecute 运行自身,之后退出。这个运行的时候,是请求 UAC 运行的

按照同样的原理,写入下一个脚本(具体思路可以往下看,如果不想看可以跳过)

Set RequestUAC = CreateObject("Shell.Application")
currentpath = createobject("Scripting.FileSystemObject").GetFolder(".").Path
RequestUAC.ShellExecute "cmd.exe","/c start wt.exe cmd /k cd /d" + currentpath, ,"runas",0
WScript.Quit 

思路:首先直接改代码,写成这样

Set RequestUAC = CreateObject("Shell.Application")
RequestUAC.ShellExecute "wt.exe", , ,"runas",1
WScript.Quit 

双击运行,发现提示错误。

C:\Users\UserName\AppData\Local\Microsoft\WindowsApps\wt.exe
系统无法访问此文件。

Win+R 或者在 cmd 里面运行 wt 是可以的,考虑这种情况,代码改成

Set RequestUAC = CreateObject("Shell.Application")
RequestUAC.ShellExecute "cmd.exe","/c wt.exe", ,"runas",1
WScript.Quit 

现在运行 1.vbs 可以打开了,但是打开的 Terminal 位置又不对了…而且cmd的黑框还是会有的。先解决黑框的问题,换成start wt.exe

Set RequestUAC = CreateObject("Shell.Application")
RequestUAC.ShellExecute "cmd.exe","/c start wt.exe", ,"runas",1
WScript.Quit 

现在cmd是一闪而过自己关闭了。然后更改 ShellExecute 的参数,1改成0,隐藏了 cmd 窗口

Set RequestUAC = CreateObject("Shell.Application")
RequestUAC.ShellExecute "cmd.exe","/c start wt.exe", ,"runas",0
WScript.Quit 

之后解决路径问题,由于 cmd.exe (第一次启动的 cmd 的位置就不正确,是 system32),因此考虑再进一步让 wt.exe 去改变目录, powershell 没有找到如何运行的时候同时执行代码,所以又改成了再次运行 cmd
即最终的命令是这个

cmd.exe /c start wt.exe cmd /k cd /d {direction}

写到 vbs 里面,首先拿 currentPath 存储一下位置,之后加到命令上面,成了这样

Set RequestUAC = CreateObject("Shell.Application")
currentpath = createobject("Scripting.FileSystemObject").GetFolder(".").Path
RequestUAC.ShellExecute "cmd.exe","/c start wt.exe cmd /k cd /d" + currentpath,"runas",0
WScript.Quit 

现在这个 vbs 可以在运行目录打开 Windows Terminal

运行更多的shell

和上面 创建 Term 的方法一样,创建其他项目即可。最后给 wt.exe 加上一个要运行的程序
我默认的是 powershell ,所以又添加了 cmdbash

C:\Users\UserName\AppData\Local\Microsoft\WindowsApps\wt.exe cmd
C:\Users\UserName\AppData\Local\Microsoft\WindowsApps\wt.exe bash

注册表样例

不保证直接导入是否会有问题,首先更改里面的 UserName 为自己账户名

直接启动 wt

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt powershell]
@="powershell - Windows terminal"
"Icon"="%USERPROFILE%\\AppData\\Local\\terminal\\wt_32.ico"

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt powershell\command]
@="C:\\Users\\UserName\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe"

运行其他 shell

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt powershell]
@="powershell - Windows terminal"
"Icon"="%USERPROFILE%\\AppData\\Local\\terminal\\wt_32.ico"

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt powershell\command]
@="C:\\Users\\UserName\\AppData\\Local\\Microsoft\\WindowsApps\\wt.exe powershell"

UAC 运行 cmd

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt cmd uac]
@="cmd(UAC) - Windows terminal"
"Icon"="%USERPROFILE%\\AppData\\Local\\terminal\\wt_32.ico"

[HKEY_CLASSES_ROOT\Directory\Background\shell\wt cmd uac\command]
@="C:\\Windows\\System32\\wscript.exe C:\\Users\\UserName\\AppData\\Local\\terminal\\runwt.vbs"

其中 runwt.vbs 的内容是

Set RequestUAC = CreateObject("Shell.Application")
currentpath = createobject("Scripting.FileSystemObject").GetFolder(".").Path
RequestUAC.ShellExecute "cmd.exe","/c start wt.exe cmd /k cd /d" + currentpath,"runas",0
WScript.Quit 

VBS参考
ShellExecute
currentPath

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云