答案1
我把它放在这里,因为它太短了,不适合发表评论,而且您不是在问 PowerShell 代码问题,而是在问“如何配置我的环境/选择的工具来执行 X 或 Y”。
- Windows Terminal 不是 shell/命令处理器。
- WT 中没有运行的概念。
- 仅使用命令处理器、PowerShell 或 cmd.exe 运行。cmd.exe 执行 .bat、.cmd、.vbs。Powershell 执行.ps。
- WT 在启动时会启动您的默认 shell/命令处理器。
- 执行程序
- 密码破解程序
- 命令执行程序
- 执行程序
- Python 程序
即使你重新修改了它,它仍然只会运行你在 JSON 设置中配置的默认 shell/命令处理器。那么,为什么要启动 shell 主机,只是为了运行 shell/命令处理器。
显示的内容NotTheDr01ds
已经是右键单击 .ps1 文件时的默认设置,尝试将其更改为 WT.exe 将不会像您想象的那样工作。
您可以先使用 WinKey + R 并输入以下内容来验证这一点。一个不起作用,另一个起作用。
wt d:\scripts\hello.ps1
# Results - error and locks WT
<#
[error 0x800700c1 when launching `d:\scripts\hello.ps1']
#>
wt powershell -noprofile -noexit d:\scripts\hello.ps1
# Results - runs the script as expected
<#
Hello World
Tuesday, 23 March, 2021 20:15:28
#>
因此,任何 reg hack 都需要您指定命令处理器和文件名以及成功运行所需的任何参数。正如我在评论中指出的那样。您可以避免使用 reghacks,只需创建一个快捷方式并将此快捷方式添加到您的 SendTo 菜单即可。在 Windows 资源管理器中,只需键入...
shell:SendTo
或者在 PowerShell 中这样做:
explorer shell:SendTo
...并将您的快捷方式粘贴到那里(我那里有很多),然后您必须更改设置。
# Example:
"C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.6.10571.0_x64__8wekyb3d8bbwe\wt.exe" powershell -noprofile -noexit
我提前通知您,这遇到了一些问题。
有时它有效,有时则无效。
现在,当然,如果您想对任何命令处理器执行此操作,那么您需要创建多个快捷方式,根据需要更改它们,然后将它们粘贴到 SendTo 文件夹,然后右键单击您的文件,并选择正确的 SendTo 快捷方式。
答案2
我只想单击 .bat 并让它在 Windows 终端应用程序内的 CMD 窗口中运行。
如果您愿意拥有两个文件,这是很简单的。
想跑把我输入终端在 Windows 终端内?
创造启动器:
wt cmd /k call "C:\Users\John\Scripts\putMeInTerminal.bat"
双击后启动器,把我输入终端现在将根据需要在 Windows 终端中运行。
答案3
正如您所知,今天的默认行为是:
- 双击文件
.bat
:conhost.exe
在“旧”的“Windows 控制台”( ) 终端 中的 CMD shell 中运行脚本 - 双击文件
.ps1
:在记事本中打开脚本 - 右键单击
.ps1
文件并“使用 PowerShell 运行”: 在“旧” Windows 控制台终端中运行 PowerShell 中的脚本
如果我理解正确的话,您想要改变(1)和(3)的行为以在各自的 shell 中运行脚本,但在 Windows 终端内。
@postanote 提出了很好的观点:
- 注册表黑客应该最后的手段。
shell:SendTo
可能适用于多种情况,而无需修改注册表。
因此,@postanote 建议的 SendTo 技术值得一试,看看它是否适合您。起初,我以为如果脚本路径中有空格,它可能会失败。但在我的测试中,Windows 似乎使用了 8.3 短路径。
SendTo 方法确实有两个缺点:
- SendTo 适用于所有文件类型,所以你会看到发给->Windows 终端当单击不支持的文件时。
- SendTo 条目嵌套在子菜单下,因此需要额外移动鼠标才能访问。另一方面,“打开方式”样式的命令位于右键菜单的顶部。
如果事实证明您还需要更多内容,请继续阅读注册表修改说明。我确实认为这些是安全的修改,但适用正常的注册表警告 - 您的里程可能会有所不同 / 进行备份 / 这里有龙 / 等等。
下一个警告,当你大概可以修改默认的.bat
双击“打开”命令,但我不建议这么做。可能可能是其他应用程序(甚至是 Windows 功能)依赖该默认行为。我的建议是添加对于 CMD 文件,右键单击“在 Windows 终端中运行”选项.bat
,就像我们对 PowerShell.ps1
文件所做的那样。
要做到这一点:
- 运行
regedit.exe
(或您喜欢的启动注册表编辑器的方法) - 导航
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\batfile\shell
- 右键点击
shell
-> 新建 -> 键 - 将键命名为“run_in_wt”
- 右键单击
run_in_wt
-> 新建 -> 字符串值 - 将属性命名为“MUIVerb”
- 双击
MUIVerb
并将数值数据设置为“在 Windows 终端中运行”(或者您希望它出现在右键菜单中) - 再次右键单击
run_in_wt
-> 新建 -> 键 - 将键命名为“command”
- 双击属性
(Default)
并将数值数据设置为wt new-tab --title "CMD Shell" cmd.exe /k "%1"
- 该
/k
开关使脚本完成后 shell 不会退出。这与“正常”的双击行为不同。如果您想旧的行为,只需将其更改为/k
,/c
并且脚本完成时 shell 将退出。 - 引用
"%1"
此处允许我们运行路径中带有空格的脚本。Windows 将用右键单击的脚本的完整路径替换%1
。
- 该
- 测试一下
对于 Powershell/.ps1
文件,重复该过程,但是:
导航
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
重复上述操作,直到更改
(Default)
的属性command
。此处的数值数据将是wt new-tab --title "Windows PowerShell" powershell.exe -NoExit -Command "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass } \; & '%1'"
- 与以前一样,
-NoExit
添加是为了防止脚本完成时 shell 退出(从而关闭选项卡/窗口)。 - 如果需要,您可以添加一个
-NoProfile
,以防止在以这种方式执行脚本时运行 PowerShell 启动。我没有放在那里,以防您的脚本有任何加载到您的配置文件中的依赖项。
- 与以前一样,
是
Set-ExecutionPolicy
从“使用 PowerShell 7 运行”右键菜单中复制的,该菜单是随 Windows 上的 PowerShell Core 一起安装的可选菜单。只要策略不是最严格的级别,它就允许脚本执行(绕过限制)。
其他说明:
powershell.exe
最佳做法是使用和的完全限定路径cmd.exe
,您可能应该修改上述命令以执行此操作。但是,我认为不带路径直接使用会更安全,因为它是为 Microsoft Store 应用定义的“应用执行别名”。另一方面,如果您没有通过 Store 安装,也许您也wt.exe
应该使用安装位置的完整路径。wt.exe
如果您启动了其他扩展程序(例如
.cmd
CMD),那么您也需要设置它们。例如,cmdfile
在同一个注册表叶下。pwsh.exe
当然,您也可以通过使用而不是 来修改上述内容以适用于 PowerShell Corepowershell.exe
。在我看来,这个过程最难的部分是确保引用和转义正确。Windows 使用 CMD shell 的引用和转义规则解析这些命令,但我们也在运行 PowerShell 代码里面需要正确转义的命令。
从评论中的讨论中可以看出,很多人认为“终端”与“shell”是一个重要的区别,事实也确实如此。但我不认为我们应该期望在这里提问(甚至回答)的每个人都有“完美”的词汇来描述他们所问的问题。我们问;我们回答;我们学习。如果任何评论听起来太过苛刻,请原谅。
答案4
是的。将 Windows 终端设置为默认终端全部随着最近发布的 Windows Terminal,Windows 11 中现在可以运行控制台/终端应用程序。
在撰写此问题时,此功能在 Windows 10 上使用 Insider/Dev Channel 版本可用。这不再是一个选项,因为此时所有具有此功能的 Windows 10 Insider/Dev 版本都已过期。
对于使用 Windows 11 并已更新 Windows 终端的用户:
打开 Windows 终端。
单击向下的 V 形标记 (⌄),然后单击设置(Ctrl+ ,)。
来自默认终端应用程序下拉,选择Windows 终端并点击节省。
来自旧版 Windows Terminal 预览版的屏幕截图