是否可以默认在 Windows 终端中运行脚本?

是否可以默认在 Windows 终端中运行脚本?

我有一些不时运行的 power shell 和 cmd 脚本。当我单击 bat 脚本时,它会打开一个经典的 CMD 窗口。当我运行 PS1 脚本时,它会打开经典的 PowerShell 窗口。

当我运行它们时,是否可以默认在新的 Windows 终端中打开它们?不,我不想打开终端,导航到脚本并运行它。我只想单击 .bat 并让它在 Windows 终端应用程序内的 CMD 窗口中运行。

这能做到吗?

我尝试找到终端 exe,以便可以设置 ps1 文件以使用它来打开,但尝试这样做时出现错误。见屏幕截图。

在此处输入图片描述

谢谢!

答案1

我把它放在这里,因为它太短了,不适合发表评论,而且您不是在问 PowerShell 代码问题,而是在问“如何配置我的环境/选择的工具来执行 X 或 Y”。

  1. Windows Terminal 不是 shell/命令处理器。
  2. WT 中没有运行的概念。
  3. 仅使用命令处理器、PowerShell 或 cmd.exe 运行。cmd.exe 执行 .bat、.cmd、.vbs。Powershell 执行.ps
  4. WT 在启动时会启动您的默认 shell/命令处理器。
  • 执行程序
  • 密码破解程序
  • 命令执行程序
  • 执行程序
  • Python 程序

...无论您在 WT 设置中配置了什么处理器。

即使你重新修改了它,它仍然只会运行你在 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

正如您所知,今天的默认行为是:

  1. 双击文件.batconhost.exe在“旧”的“Windows 控制台”( ) 终端 中的 CMD shell 中运行脚本
  2. 双击文件.ps1在记事本中打开脚本
  3. 右键单击.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

  • 如果您启动了其他扩展程序(例如.cmdCMD),那么您也需要设置它们。例如,cmdfile在同一个注册表叶下。

  • pwsh.exe当然,您也可以通过使用而不是 来修改上述内容以适用于 PowerShell Core powershell.exe

  • 在我看来,这个过程最难的部分是确保引用和转义正确。Windows 使用 CMD shell 的引用和转义规则解析这些命令,但我们也在运行 PowerShell 代码里面需要正确转义的命令。

  • 从评论中的讨论中可以看出,很多人认为“终端”与“shell”是一个重要的区别,事实也确实如此。但我不认为我们应该期望在这里提问(甚至回答)的每个人都有“完美”的词汇来描述他们所问的问题。我们问;我们回答;我们学习。如果任何评论听起来太过苛刻,请原谅。

答案4

是的。将 Windows 终端设置为默认终端全部随着最近发布的 Windows Terminal,Windows 11 中现在可以运行控制台/终端应用程序。

在撰写此问题时,此功能在 Windows 10 上使用 Insider/Dev Channel 版本可用。这不再是一个选项,因为此时所有具有此功能的 Windows 10 Insider/Dev 版本都已过期。

对于使用 Windows 11 并已更新 Windows 终端的用户:

  1. 打开 Windows 终端。

  2. 单击向下的 V 形标记 (),然后单击设置Ctrl+ ,)。

  3. 来自默认终端应用程序下拉,选择Windows 终端并点击节省

Windows 终端设置

来自旧版 Windows Terminal 预览版的屏幕截图

相关内容