npocmaka
npocmaka

Reputation: 57252

How to create file extension that behaves as .cmd/.bat?

I suppose this is a strange question . but I'm curious.This is what I've tried so far: I've exported and compare values from [HKEY_CLASSES_ROOT\batfile] ,[HKEY_CLASSES_ROOT\cmdfile],[HKEY_CLASSES_ROOT\.bat],[HKEY_CLASSES_ROOT\.cmd] . The only differences I've noticed were in HKEY_CLASSES_ROOT\*\FrienflyTypeName which suppose is not crucial for their execution.So I've created an registry values with same data for desired extension(I'm trying to create .scjs file extension ):

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}"

Also I've added the value (.SCJS) to the PATEXT variable -> .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.SCJS

but when I run the file I get : test.scjs is not valid Win32 application.Access is denied.

So it is even possible?Is there something else I should change?

EDIT : the best solution I've found: for open key I use:

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

where I have caller.bat in system32:

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

wish simply cmd /c it's harder to manage the arguments.Looks at the moment there's no way to handle command line arguments.

ONE MORE EDIT: The one way to handle the command line arguments is to use [HKEY_CLASSES_ROOT\scjsfile\shell\open\Run] instead of [HKEY_CLASSES_ROOT\scjsfile\shell\open\command] .I don't know what exactly is the difference right now , but it works (I saw this from my AutoIT installation :-) ).

Upvotes: 4

Views: 1969

Answers (4)

npocmaka
npocmaka

Reputation: 57252

First need an "installation" script :

   @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" %%*

then we can try a simple .test file:

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

ASSOC and FTYPE both have immediate effect so we can start a .test file right after "installation" and there's no need of second cmd instance.

Upvotes: 1

Bali C
Bali C

Reputation: 31221

Although this has already been accepted I thought I would add in my answer that I hacked together.

I created my own file extension .bali in which I can put some batch commands and run them by opening the file.

The .bali registry export looks like this

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.bali]
@="BaliFile"

Note that this value can't have spaces (might work if it's quoted, but didn't try it).

The balifile registry export look like this

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"

My file.bali looks like this

echo hello bali
pause

The file will have the cmd icon as well, and when it is run it will run the commands in the prompt, obviously outputting hello bali.

This is limited as to what you can use, you can't for example use variables, but you can experiment with it yourself to find out what you can and can't do.

Not sure if this is what you are looking for, but it was quite fun to make anyways :)

Upvotes: 2

dbenham
dbenham

Reputation: 130819

This same question was asked previously, but I can't find it.

The consensus was that it is impossible - Windows will not allow execution of batch files that do not have an extension of .bat or .cmd

I remember one poster mentioned the security loop hole that would be created if it were allowed.

Upvotes: 1

ElektroStudios
ElektroStudios

Reputation: 20464

You need to associate a PROGRAM for the desired extension...

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\""

Now create a new file in your desktop named "File.test" and double-click on it, notepad will open it.

I hope this helped you.

UPDATE

For registered extensions in your PC... for example ".bat" is registered by "batfile" key then you need to associate the program inside the registered key, i'll mean "batfile" key, not ".bat" key.

PS: Sorry for my english.

Upvotes: 0

Related Questions