小弹窗方式:

方法 1: 手动通过注册表添加

  1. 打开注册表编辑器Win + R > regedit(管理员身份)。
  2. 导航路径:HKEY_CLASSES_ROOT\*\shell。
  3. 创建新项
    • 右键 shell > 新建 > 项,命名为 Change Extension。
    • 右键 Change Extension > 新建 > 项,命名为 command。
  4. 设置值
    • 双击 Change Extension 下的 (默认),设置为 更改扩展名。

    • 双击 command 下的 (默认),设置为以下完整命令(一行):

      powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -Command "Add-Type -AssemblyName Microsoft.VisualBasic; $newName = [Microsoft.VisualBasic.Interaction]::InputBox('输入新文件名(包括扩展名)', '更改扩展名', (Get-Item '%1').Name); if ($newName -and $newName -ne (Get-Item '%1').Name) { Rename-Item '%1' -NewName $newName }"
      
      • 解释
        • Add-Type -AssemblyName Microsoft.VisualBasic:加载 GUI 组件。
        • InputBox:弹出小窗口,标题“更改扩展名”,默认输入当前文件名。
        • if 条件:仅在输入有效且不同时执行重命名,避免空操作。
        • -WindowStyle Hidden:隐藏 PowerShell 控制台窗口,只显示 GUI 框。
  5. 可选:图标
    • 右键 Change Extension > 新建 > 字符串值,命名为 Icon,值 shell32.dll,3。
  6. 应用:关闭 regedit,重启资源管理器(任务管理器 > 结束“Windows 资源管理器” > 运行新任务 > explorer.exe)。

测试:右键文件 > “更改扩展名”,弹出小窗口,输入如 file.bat,确认。系统警告扩展变更,确认即可。

方法 2: 使用 .reg 文件一键导入

  1. 打开记事本,复制以下内容:

    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT\*\shell\Change Extension]
    @="更改扩展名"
    "Icon"="shell32.dll,3"
    [HKEY_CLASSES_ROOT\*\shell\Change Extension\command]
    @="powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -Command \"Add-Type -AssemblyName Microsoft.VisualBasic; $newName = [Microsoft.VisualBasic.Interaction]::InputBox('输入新文件名(包括扩展名)', '更改扩展名', (Get-Item '%1').Name); if ($newName -and $newName -ne (Get-Item '%1').Name) { Rename-Item '%1' -NewName $newName }\""
    
  2. 保存为 AddChangeExtensionGUI.reg(“所有文件”类型)。

  3. 双击运行,确认导入。

  4. 重启资源管理器测试。

高级变体:仅修改扩展名的小窗口

如果只想改扩展名(保持主体名),

powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -Command "Add-Type -AssemblyName Microsoft.VisualBasic; $newName = [Microsoft.VisualBasic.Interaction]::$base = (Get-Item '%1').BaseName; $ext = [Microsoft.VisualBasic.Interaction]::InputBox('输入新扩展名(不带点,如 bat)', '更改扩展名', (Get-Item '%1').Extension.Substring(1)); if ($ext) { Rename-Item '%1' -NewName \"$base.$ext\" }

powershell弹窗方式:

在 Windows 11 右键菜单中添加“更改扩展名”选项(无需 VBS,使用 PowerShell)

基于您的要求,我们避免使用 VBS 脚本,转而采用 PowerShell 一行命令实现。点击右键选项后,会弹出命令行窗口提示您输入完整的新文件名(包括扩展名),如将 file.txt 改为 file.bat。这比直接编辑更安全,且无需外部脚本文件(纯命令行调用)。

前提:确保文件扩展名已显示(文件资源管理器 > 查看 > 显示 > 文件扩展名)。修改注册表前备份(regedit > 文件 > 导出)。

方法 1: 手动通过注册表添加(推荐,简单)

  1. 打开注册表编辑器:按 Win + R,输入 regedit,以管理员身份运行。
  2. 导航路径:转到 HKEY_CLASSES_ROOT*\shell。
  3. 创建新项
    • 右键 shell > 新建 > 项,命名为 Change Extension。
    • 右键 Change Extension > 新建 > 项,命名为 command。
  4. 设置值
    • 双击 Change Extension 下的 (默认),设置为 更改扩展名(菜单显示文本)。

    • 双击 command 下的 (默认),设置为:

      powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Rename-Item '%1' -NewName (Read-Host '输入新文件名(包括扩展名)')"
      
      • 解释:-NoProfile 避免加载配置文件;-ExecutionPolicy Bypass 绕过执行策略;Read-Host 提示输入新名;%1 是选中的文件路径。
  5. 可选:添加图标
    • 右键 Change Extension > 新建 > 字符串值,命名为 Icon,值设为 shell32.dll,3。
  6. 应用:关闭 regedit,重启资源管理器(任务管理器 > 进程 > Windows 资源管理器 > 结束任务 > 文件 > 运行新任务 > explorer.exe)。

测试:右键文件 > “更改扩展名”,输入新名,回车确认。系统会警告扩展名变更,确认即可。

方法 2: 使用 .reg 文件一键导入

  1. 打开记事本,复制以下内容:

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\*\shell\Change Extension]
    @="更改扩展名"
    "Icon"="shell32.dll,3"
    
    [HKEY_CLASSES_ROOT\*\shell\Change Extension\command]
    @="powershell.exe -NoProfile -ExecutionPolicy Bypass -Command \"Rename-Item '%1' -NewName (Read-Host '输入新文件名(包括扩展名)')\""
    
  2. 保存为 AddChangeExtensionNoVBS.reg(“所有文件”类型)。

  3. 双击运行,确认导入。

  4. 重启资源管理器测试。

高级变体:仅提示新扩展名(保持原文件名)

如果只想改扩展名(不改主体名),修改命令为:

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "$base = (Get-Item '%1').BaseName; $ext = Read-Host '输入新扩展名(不带点,如 bat)'; Rename-Item '%1' -NewName \"$base.$ext\""
  • 这会自动取原文件名主体 + 新扩展名。替换 .reg 或注册表中的命令即可。

右键添加"打开空白文档":

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\DesktopBackground\Shell\BlankNotepad]
"MUIVerb"="打开空白记事本"
"Icon"="notepad.exe"
"Position"="Top"

[HKEY_CLASSES_ROOT\DesktopBackground\Shell\BlankNotepad\command]
@="notepad.exe"

或者 .vbs

Option Explicit
'~ On Error Resume Next
RequireAdmin

Dim objReg
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

RegWrite "HKCR\DesktopBackground\Shell\BlankNotepad", "MUIVerb", "REG_SZ", "打开空白记事本"
RegWrite "HKCR\DesktopBackground\Shell\BlankNotepad", "Icon", "REG_SZ", "notepad.exe"
RegWrite "HKCR\DesktopBackground\Shell\BlankNotepad", "Position", "REG_SZ", "Top"
RegWrite "HKCR\DesktopBackground\Shell\BlankNotepad\command", "", "REG_SZ", "notepad.exe"

Function RegWrite(reg_keyname, reg_valuename,reg_type,ByVal reg_value)
	Dim aRegKey, Return
	aRegKey = RegSplitKey(reg_keyname)
	If IsArray(aRegKey) = 0 Then
		RegWrite = 0
		Exit Function
	End If

	Return = RegWriteKey(aRegKey)
	If Return = 0 Then
		RegWrite = 0
		Exit Function
	End If

	Select Case reg_type
		Case "REG_SZ"
			Return = objReg.SetStringValue(aRegKey(0),aRegKey(1),reg_valuename,reg_value)
		Case "REG_EXPAND_SZ"
			Return = objReg.SetExpandedStringValue(aRegKey(0),aRegKey(1),reg_valuename,reg_value)
		Case "REG_BINARY"
			If IsArray(reg_value) = 0 Then reg_value = Array()
			Return = objReg.SetBinaryValue(aRegKey(0),aRegKey(1),reg_valuename,reg_value)

		Case "REG_DWORD"
			If IsNumeric(reg_value) = 0 Then reg_value = 0
			Return = objReg.SetDWORDValue(aRegKey(0),aRegKey(1),reg_valuename,reg_value)

		Case "REG_MULTI_SZ"
			If IsArray(reg_value) = 0 Then
				If Len(reg_value) = 0 Then
					reg_value = Array()
				Else
					reg_value = Array(reg_value)
				End If
			End If
			Return = objReg.SetMultiStringValue(aRegKey(0),aRegKey(1),reg_valuename,reg_value)

		'Case "REG_QWORD"
			'Return = oReg.SetQWORDValue(aRegKey(0),aRegKey(1),reg_valuename,reg_value)
		Case Else
			RegWrite = 0
			Exit Function
	End Select

	If (Return <> 0) Or (Err.Number <> 0) Then
		RegWrite = 0
		Exit Function
	End If
	RegWrite = 1
End Function

Function RegWriteKey(RegKeyName)
	Dim Return
	If IsArray(RegKeyName) = 0 Then
		RegKeyName = RegSplitKey(RegKeyName)
	End If

	If (IsArray(RegKeyName) = 0) Or (UBound(RegKeyName) <> 1) Then
		RegWriteKey = 0
		Exit Function
	End If

	Return = objReg.CreateKey(RegKeyName(0),RegKeyName(1))
	If (Return <> 0) Or (Err.Number <> 0) Then
		RegWriteKey = 0
		Exit Function
	End If
	RegWriteKey = 1
End Function

Function RegDelete(reg_keyname, reg_valuename)
	Dim Return,aRegKey
	aRegKey = RegSplitKey(reg_keyname)
	If IsArray(aRegKey) = 0 Then
		RegDelete = 0
		Exit Function
	End If

	Return = objReg.DeleteValue(aRegKey(0),aRegKey(1),reg_valuename)
	If (Return <> 0) And (Err.Number <> 0) Then
		RegDelete = 0
		Exit Function
	End If
	RegDelete = 1
End Function

Function RegDeleteKey(reg_keyname)
	Dim Return,aRegKey
	aRegKey = RegSplitKey(reg_keyname)
	If IsArray(aRegKey) = 0 Then
		RegDeleteKey = 0
		Exit Function
	End If

	'On Error Resume Next
	Return = RegDeleteSubKey(aRegKey(0),aRegKey(1))
	'On Error Goto 0
	If Return = 0 Then
		RegDeleteKey = 0
		Exit Function
	End If
	RegDeleteKey = 1
End Function

Function RegDeleteSubKey(strRegHive, strKeyPath)
	Dim Return,arrSubkeys,strSubkey
    objReg.EnumKey strRegHive, strKeyPath, arrSubkeys
    If IsArray(arrSubkeys) <> 0 Then
        For Each strSubkey In arrSubkeys
            RegDeleteSubKey strRegHive, strKeyPath & "\" & strSubkey
        Next
    End If

	Return = objReg.DeleteKey(strRegHive, strKeyPath)
	If (Return <> 0) Or (Err.Number <> 0) Then
		RegDeleteSubKey = 0
		Exit Function
	End If
	RegDeleteSubKey = 1
End Function

Function RegSplitKey(RegKeyName)
	Dim strHive, strInstr, strLeft
	strInstr=InStr(RegKeyName,"\")
	If strInstr = 0 Then Exit Function
	strLeft=left(RegKeyName,strInstr-1)

	Select Case strLeft
		Case "HKCR","HKEY_CLASSES_ROOT"	strHive = &H80000000
		Case "HKCU","HKEY_CURRENT_USER"	strHive = &H80000001
		Case "HKLM","HKEY_LOCAL_MACHINE"	strHive = &H80000002
		Case "HKU","HKEY_USERS" 	strHive = &H80000003
		Case "HKCC","HKEY_CURRENT_CONFIG"	strHive = &H80000005
	  Case Else Exit Function
	End Select

    RegSplitKey = Array(strHive,Mid(RegKeyName,strInstr+1))
End Function

Function RequireAdmin()
	Dim reg_valuename, WShell, Cmd, CmdLine, I

	GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")_
	.EnumValues &H80000003, "S-1-5-19\Environment",  reg_valuename
	If IsArray(reg_valuename) <> 0 Then
		RequireAdmin = 1
		Exit Function
	End If

	Set Cmd = WScript.Arguments
	For I = 0 to Cmd.Count - 1
		If Cmd(I) = "/admin" Then
			Wscript.Echo "To script you must have administrator rights!"
			'RequireAdmin = 0
			'Exit Function
			WScript.Quit
		End If
		CmdLine = CmdLine & Chr(32) & Chr(34) & Cmd(I) & Chr(34)
	Next
	CmdLine = CmdLine & Chr(32) & Chr(34) & "/admin" & Chr(34)

	Set WShell= WScript.CreateObject( "WScript.Shell")
	CreateObject("Shell.Application").ShellExecute WShell.ExpandEnvironmentStrings(_
	"%SystemRoot%\System32\WScript.exe"),Chr(34) & WScript.ScriptFullName & Chr(34) & CmdLine, "", "runas"
	WScript.Quit
End Function


windows11 “”我的电脑“”右键添加“控制面板”:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\ControlPanel] "Icon"="control.exe" "MUIVerb"="@shell32.dll,-4161" "Position"="Bottom"

[HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\ControlPanel\command] @="control.exe"

Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

登录

注册

重设密码

请输入您的用户名或电子邮箱地址。您会收到一封包含创建新密码链接的电子邮件。