如何创建表现为.cmd / .bat的文件扩展名?

时间:2012-11-27 10:18:11

标签: windows batch-file registry cmd

我想这是一个奇怪的问题。但我很好奇。这是我到目前为止所尝试的:  我已导出并比较[HKEY_CLASSES_ROOT\batfile][HKEY_CLASSES_ROOT\cmdfile][HKEY_CLASSES_ROOT\.bat][HKEY_CLASSES_ROOT\.cmd]的值。我注意到的唯一区别在于HKEY_CLASSES_ROOT\*\FrienflyTypeName,这对于他们的执行并不重要。所以我创建了一个具有相同数据的注册表值,用于所需的扩展(我正在尝试创建 .scjs < / em>文件扩展名):

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.scjs]
@="scjsfile"
#this says that the file will contains text
[HKEY_CLASSES_ROOT\.scjs\PersistentHandler]
@="{5e941d80-bf96-11cd-b579-08002b30bfeb}"

[HKEY_CLASSES_ROOT\scjsfile]
@="Windows Batch File"
"EditFlags"=hex:30,04,00,00
"FriendlyTypeName"=hex(2):40,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,\
  00,6f,00,6f,00,74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,\
  32,00,5c,00,61,00,63,00,70,00,70,00,61,00,67,00,65,00,2e,00,64,00,6c,00,6c,\
  00,2c,00,2d,00,36,00,30,00,30,00,32,00,00,00

[HKEY_CLASSES_ROOT\scjsfile\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,69,00,6d,00,\
  61,00,67,00,65,00,72,00,65,00,73,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,36,\
  00,38,00,00,00

[HKEY_CLASSES_ROOT\scjsfile\shell]

[HKEY_CLASSES_ROOT\scjsfile\shell\edit]

[HKEY_CLASSES_ROOT\scjsfile\shell\edit\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
  00

  #copied from batfile from HKEY_CLASSES_ROOT .Same as cmdfile reg values
[HKEY_CLASSES_ROOT\scjsfile\shell\open]
"EditFlags"=hex:00,00,00,00

[HKEY_CLASSES_ROOT\scjsfile\shell\open\command]
@="\"%1\" %*"

[HKEY_CLASSES_ROOT\scjsfile\shell\print]

[HKEY_CLASSES_ROOT\scjsfile\shell\print\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,2f,00,70,00,20,\
  00,25,00,31,00,00,00

[HKEY_CLASSES_ROOT\scjsfile\shell\runas]
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\scjsfile\shell\runas\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6d,00,\
  64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,43,00,20,00,22,00,25,00,31,00,22,\
  00,20,00,25,00,2a,00,00,00

[HKEY_CLASSES_ROOT\scjsfile\shell\runasuser]
@="@shell32.dll,-50944"
"Extended"=""
"SuppressionPolicyEx"="{F211AA05-D4DF-4370-A2A0-9F19C09756A7}"

[HKEY_CLASSES_ROOT\scjsfile\shell\runasuser\command]
"DelegateExecute"="{ea72d00e-4960-42fa-ba92-7792a7944c1d}"

[HKEY_CLASSES_ROOT\scjsfile\ShellEx]

[HKEY_CLASSES_ROOT\scjsfile\ShellEx\ContextMenuHandlers]
@="Compatibility"

[HKEY_CLASSES_ROOT\scjsfile\ShellEx\ContextMenuHandlers\Compatibility]
@="{1d27f844-3a1f-4410-85ac-14651078412d}"

[HKEY_CLASSES_ROOT\scjsfile\ShellEx\ContextMenuHandlers\OpenGLShExt]
@="{E97DEC16-A50D-49bb-AE24-CF682282E08D}"

[HKEY_CLASSES_ROOT\scjsfile\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"

[HKEY_CLASSES_ROOT\scjsfile\ShellEx\PropertySheetHandlers]

[HKEY_CLASSES_ROOT\scjsfile\ShellEx\PropertySheetHandlers\ShimLayer Property Page]
@="{513D916F-2A8E-4F51-AEAB-0CBC76FB1AF8}"

[HKEY_CLASSES_ROOT\scjsfile\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}]
@="{1531d583-8375-4d3f-b5fb-d23bbd169f22}"

此外,我已将值(.SCJS)添加到PATEXT变量 - &gt; .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.SCJS

但是当我运行该文件时,我得到: test.scjs无效Win32 application.Access被拒绝。

所以它甚至可能吗?还有什么我应该改变的吗?

编辑:我发现的最佳解决方案: 对于我使用的开放键:

[HKEY_CLASSES_ROOT\scjsfile\shell\open\command]
@="%SystemRoot%\\System32\\caller.bat \"%1\" \"%*\""

我在system32中有caller.bat:

@echo off
copy "%~nx1"  "%temp%\%~nx1.bat" /Y >nul
"%temp%\%~nx1" .bat %~2

希望简单cmd /c管理参数更难。目前无法处理命令行参数。

一个更多编辑:处理命令行参数的一种方法是使用[HKEY_CLASSES_ROOT\scjsfile\shell\open\Run]而不是[HKEY_CLASSES_ROOT\scjsfile\shell\open\command]。我不知道差异究竟是什么现在,但它的确有效(我从我的AutoIT安装中看到了这个:-))。

4 个答案:

答案 0 :(得分:2)

虽然这已被接受,但我认为我会在答案中加入我一起攻击。

我创建了自己的文件扩展名.bali,我可以在其中放置一些批处理命令并通过打开文件来运行它们。

.bali注册表导出如下所示

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.bali]
@="BaliFile"

请注意,此值不能包含空格(如果引用它可能有效,但没有尝试)。

balifile注册表导出看起来像这样

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\balifile]

[HKEY_CLASSES_ROOT\balifile\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-68"

[HKEY_CLASSES_ROOT\balifile\shell]

[HKEY_CLASSES_ROOT\balifile\shell\open]

[HKEY_CLASSES_ROOT\balifile\shell\open\command]
@="cmd.exe /c for /f \"delims=\" %%a in (%1) do %%a"

我的file.bali看起来像这样

echo hello bali
pause

该文件也将具有cmd图标,当它运行时,它将在提示符中运行命令,显然输出hello bali

这是有限的,你可以使用什么,你不能使用变量,但你可以自己试验,找出你能做什么和不能做什么。

不确定这是否是您正在寻找的,但无论如何都很有趣:)

答案 1 :(得分:1)

之前曾问过同样的问题,但我找不到。

一致认为这是不可能的 - Windows不允许执行没有.bat或.cmd扩展名的批处理文件

我记得有一张海报提到了在允许的情况下会创建的安全循环漏洞。

答案 2 :(得分:0)

您需要将PROGRAM与所需的扩展名相关联...

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.test]

[HKEY_CLASSES_ROOT\.test\shell]

[HKEY_CLASSES_ROOT\.test\shell\open]

[HKEY_CLASSES_ROOT\.test\shell\open\command]
@="notepad \"%1\""

现在在桌面上创建一个名为“ File.test ”的新文件,然后双击它,记事本将打开它。

我希望这对你有所帮助。

<强>更新

对于PC中注册的扩展名...例如“.bat”是通过“batfile”键注册的,那么你需要将程序与注册密钥相关联,我的意思是“batfile”键,而不是“.bat” “关键。

PS:对不起我的英文。

答案 3 :(得分:0)

首先需要一个“安装”脚本:

   @echo off

    rem :: A files with .TEST extension will be able to execute batch code but is not perfect as the %0 argument is lost

    rem :: "installing" a caller.
    if not exist "c:\caller.bat" (
       echo @echo off
       echo copy "%%~nx1"  "%%temp%%\%%~nx1.bat" /Y ^>nul
       echo "%%temp%%\%%~nx1.bat"  %%*
    ) > c:\caller.bat

    rem :: associating file extension
    assoc .test=batps
    ftype batps=c:\caller "%%1" %%*

然后我们可以尝试一个简单的.test文件:

@echo off
for /l (1;1;10) do (
  echo testing .TEST extension
)

ASSOCFTYPE都会立即生效,因此我们可以在“安装”后立即启动.test文件,并且不需要第二个cmd实例。