Is there any method in Windows through which we can execute a batch script without *.bat extension?
7 Answers
This is an interesting topic to me! I want to do some observations about it.
The important point first: A Batch file is a file with .BAT or .CMD extension. Period. Batch files can achieve, besides the execution of usual DOS commands, certain specific Batch-file facilities, in particular:
- Access to Batch file parameters via %1 %2 ... and execution of SHIFT command.
- Execution of GOTO command.
- Execution of CALL :NAME command (internal subroutine).
- Execution of SETLOCAL/ENDLOCAL commands.
Now the funny part: Any file can be redirected as input for CMD.exe so the DOS commands contained in it are executed in a similar way of a Batch file, with some differences. The most important one is that previous Batch-file facilities will NOT work. Another differences are illustrated in the NOT-Batch file below (I called it BATCH.TXT):
@echo off rem Echo off just suppress echoing of the prompt and each loop of FOR command rem but it does NOT suppress the listing of these commands! rem Pause command does NOT pause, because it takes the character that follows it pause X rem This behavior allows to put data for a SET /P command after it set /P var=Enter data: This is the data for previous command! echo Data read: "%var%" rem Complex FOR/IF commands may be assembled and they execute in the usual way: for /L %i in (1,1,5) do ( set /P line= if "!line:~0,6!" equ "SHOW: " echo Line read: !line:~6! ) NOSHOW: First line read SHOW: Second line NOSHOW: This is third line SHOW: The line number 4 NOSHOW: Final line, number five rem You may suppress the tracing of the execution redirecting CMD output to NUL rem In this case, redirect output to STDERR to display messages in the screen echo This is a message redirected to STDERR >&2 rem GOTO command doesn't work: goto label goto :EOF rem but both EXIT and EXIT /B commands works: exit /B :label echo Never reach this point... To execute previous file, type: CMD /V:ON < BATCH.TXT The /V switch is needed to enable delayed expansion.
More specialized differences are related to the fact that commands in the NOT-Batch file are executed in the command-line context, NOT the Batch-file context. Perhaps Dave or jeb could elaborate on this point.
EDIT: Additional observations (batch2.txt):
@echo off rem You may force SET /P command to read the line from keyboard instead of rem from following lines by redirecting its input to CON device. rem You may also use CON device to force commands output to console (screen), rem this is easier to write and read than >&2 echo Standard input/output operations> CON echo/> CON < CON set /P var=Enter value: > CON echo/> CON echo The value read is: "%var%"> CON Execute previous file this way: CMD < BATCH2.TXT > NUL
EDIT: More additional observations (batch3.txt)
@echo off rem Dynamic access to variables that usually requires DelayedExpansion via "call" trick rem Read the next four lines; "next" means placed after the FOR command rem (this may be used to simulate a Unix "here doc") for /L %i in (1,1,4) do ( set /P line[%i]= ) Line one of immediate data This is second line The third one And the fourth and last one... ( echo Show the elements of the array read: echo/ for /L %i in (1,1,4) do call echo Line %i- %line[%i]% ) > CON Execute this file in the usual way: CMD < BATCH3.TXT > NUL
Interesting! Isn't it?
EDIT: Now, GOTO and CALL commands may be simulated in the NotBatch.txt file!!! See this post.
Antonio
1 Comment
Just use:
type mybat.txt | cmd Breaking it down...
type mybat.txt reads mybat.txt as a text file and prints the contents. The | says capture anything getting printed by the command on its left and pass it as an input to the command on its right. Then cmd (as you can probably guess) interprets any input it receives as commands and executes them.
In case you were wondering... you can replace cmd with bash to run on Linux.
3 Comments
type with cat, and you need to make sure the script contains no shell-specific commands.in my case, to make windows run files without extension (only for *.cmd, *.exe) observed, i have missed pathext variable (in system varailbles) to include .cmd. Once added i have no more to run file.cmd than simply file.
environment variables --> add/edit system variable to include .cmd;.exe (ofcourse your file should be in path)
Comments
It could be possible yes, but probably nor in an easy way =) cause first of all.. security. I try to do the same thing some year ago, and some month ago, but i found no solution about it.. you could try to do
execu.cmd
type toLaunch.txt >> bin.cmd call bin.cmd pause > nul exit then in toLaunch.txt put
@echo off echo Hello! pause > nul exit just as example, it will "compile" the code, then it will execute the "output" file, that is just "parse"
instead of parsed you could also just rename use and maybe put an auto rename inside the script using inside toLaunch.txt
ren %0 %0.txt hope it helped!
Comments
It is possible at some degree. You'll need an admin permissions to run assoc and ftype commands. Also a 'caller' script that will use your code:
Lets say the extension you want is called .scr. Then execute this script as admin:
@echo off :: requires Admin permissions :: allows a files with .scr (in this case ) extension to act like .bat/.cmd files. :: Will create a 'caller.bat' associated with the extension :: which will create a temp .bat file on each call (you can consider this as cheating) :: and will call it. :: Have on mind that the %0 argument will be lost. rem :: "installing" a caller. if not exist "c:\scrCaller.bat" ( echo @echo off echo copy "%%~nx1" "%%temp%%\%%~nx1.bat" /Y ^>nul echo "%%temp%%\%%~nx1.bat" %%* ) > c:\scrCaller.bat rem :: associating file extension assoc .scr=scrfile ftype scrfile=c:\scrCaller "%%1" %%* You even will be able to use GOTO and CALL and the other tricks you know. The only limitation is that the the %0 argument will be lost ,tough it can be hardcoded while creating the temp file. As a lot of languages compile an .exe file for example I think this a legit approach.
Comments
There is not reason or workflow described in the original post. But in case you just want to type myscript instead of myscript.bat you can create an alias of your script and rename the alias to myscript.
My use case: I work in parallel in wsl and batch shell and want to type ls instead of dir or mv instead of move. So I created some one-line-scripts, e.g. ls.bat with contant dir %1 and create the link ls
Comments
If you want variables to be exported to the calling batch file, you could use
for /F "tokens=*" %%g in (file.txt) do (%%g) This metod has several limitations (don't use :: for comments), but its perfect for configuration files.
Example:
rem Filename: "foo.conf" rem set option1=true set option2=false set option3=true @echo off for /F "tokens=*" %%g in (foo.conf) do (%%g) echo %option1% echo %option2% echo %option3% pause
.cmdfile...