Using this CMD technique from TCC

Code:
c:\users\jlc\utils>ver

TCC  24.02.48 x64   Windows 7 [Version 6.1.7601]

Is it possible to make TCC execute this .CMD script, without modification to the .CMD script, without TCC generating errors?
Code:
<# : batch portion
@echo off & setlocal
set "arg=%~1"
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF
: end batch / begin powershell #>
# display %arg%
$env:arg
$x="123"
$x

While I am using PowerShell code for this example, this technique can be used with other scripting languages.

I have been doing;
Code:
c:\users\jlc\utils>cmd /c test.cmd
123

...in order to use this technique with no errors from TCC.

Joe
 

samintz

Scott Mintz
May 20, 2008
1,514
18
Solon, OH, USA
Optionally, you can enable PathExt, remove it from the PATHEXT list, and make .CMD an executable extension.
 
This is not specific to CMD/PowerShell. It can be used for any script language.

Here's an example for VBScript;
Code:
<!-- : Begin batch script
@echo off
cscript //nologo "%~f0?.wsf"
exit /b

----- Begin wsf script --->
<job><script language="VBScript">
  WScript.Echo "VBScript from a hybrid batch"
</script></job>

I believe this is called a Hybrid Batch file. I mainly use them with VBScript on cmd.exe systems, but there is now a need to incorporate with PowerShell on cmd.exe systems.

My only other option would be to put the script code into an NTFS Stream, and run it from there, but that means I have to change many .cmd files.

Joe
 
May 20, 2008
11,547
107
Syracuse, NY, USA
CMD not choking on a line beginning with "<" is pretty CMD specific ... yes/no?

<# ... #> is PowerShell's multi-line comment mechanism. I found this on stackoverflow (hardly documentation).
The trick is in the batch redirection priority - this line <# : will be parsed like :<# because redirection is with higher prio than the other commands. But the lines starting with : in batch files are taken as labels - i.e. not executed. Still this remains a valid powershell comment.
 

samintz

Scott Mintz
May 20, 2008
1,514
18
Solon, OH, USA
The <# ... #> syntax is a multi-line Powershell comment. https://devblogs.microsoft.com/scripting/powertip-use-powershell-multiple-line-comments/

However, I'm missing how CMD is able to ignore it. If I type that first line at a CMD prompt I get back an error that it cannot find the file.

If I type this command at a CMD prompt: ": hello"
It gets ignored, like a REM statement.
But if I type "<# : hello" I get an error that it cannot find the file specified. This is similar to what TCC does.
So CMD treats that line differently in a batch script than it does at the command line.
 
Ideally, if I had to start from scratch, and I could use TCC-RT, I would do it this way;
Code:
@echo off
type <<- endtext > %_batchname:test.vbs
WScript.echo Date
endtext
cscript //nologo %_batchname:test.vbs

However, running that from a .cmd file, it errors with;
Code:
c:\users\jlc\utils>cmd /c test.cmd
<< was unexpected at this time.

Joe
 

samintz

Scott Mintz
May 20, 2008
1,514
18
Solon, OH, USA
FWIW - in TCC, you can change the first line to just "<#" and it executes correctly. In CMD it gives a syntax error and aborts.
Code:
$ cmd /c test
The syntax of the command is incorrect.

[S:\LNX\Platform\Tools\ManufacturingApp\crypto_cli] <#

$ test hello world
hello
123
 
@vefatica;

You can run the following from cmd.exe as, for example, testvbs.cmd;
Code:
<!-- : Begin batch script
@echo off
echo cmd.exe ignores the first line of "%~f0"
echo cscript will see the batch commands as part of the comments of the .wsf file
echo.
set NameOfWSF="%~f0?.wsf"
echo cscript will be executing "%~f0" as a .wsf file
echo cscript will execute this file as %NameOfWSF%
echo If cscript tries to execute this file as "%~f0.wsf", it will fail.
cscript //nologo "%~f0.wsf"
cscript //nologo "%~f0?.wsf"
exit /b

----- Begin wsf script --->
<job><script language="VBScript">
  WScript.Echo "VBScript from a hybrid batch"
</script></job>

This is what happens when it is run from cmd.exe;
Code:
c:\utils>testvbs.cmd
cmd.exe ignores the first line of "c:\utils\testvbs.cmd"
cscript will see the batch commands as part of the comments of the .wsf file

cscript will be executing "c:\utils\testvbs.cmd" as a .wsf file
cscript will execute this file as "c:\utils\testvbs.cmd?.wsf"
If cscript tries to execute this file as "c:\utils\testvbs.cmd.wsf", it will fail.
Input Error: Can not find script file "c:\utils\testvbs.cmd.wsf".
VBScript from a hybrid batch

When I run it from tcc.exe;
Code:
c:\users\jlc\utils>testvbs.cmd
<!-- : Begin batch script
TCC: (Sys) C:\Users\jlc\utils\testvbs.cmd [1]  The system cannot find the file specified.
 "C:\Users\jlc\utils\!--"
cmd.exe ignores the first line of "C:\Users\jlc\utils\testvbs.cmd"
cscript will see the batch commands as part of the comments of the .wsf file

cscript will be executing "C:\Users\jlc\utils\testvbs.cmd" as a .wsf file
cscript will execute this file as "C:\Users\jlc\utils\testvbs.cmd?.wsf"
If cscript tries to execute this file as "C:\Users\jlc\utils\testvbs.cmd.wsf", it will fail.
Input Error: Can not find script file "C:\Users\jlc\utils\testvbs.cmd.wsf".
VBScript from a hybrid batch

Joe
 
May 20, 2008
11,547
107
Syracuse, NY, USA
Hmmm! I figured most of that. But what is the mechanism by which cscript, when told to run "C:\Users\jlc\utils\testvbs.cmd?.wsf" actually runs "C:\Users\jlc\utils\testvbs.cmd"? That seems mysterious (or I'm missing something obvious).
 
May 20, 2008
11,547
107
Syracuse, NY, USA
At least one contributor at stackoverflow says that the mechanism by which
Code:
cscript "anyfile?.wsf"
will cause cscript.exe to run "anyfile" is undocumented. I didn't try to find out if that (that it's undocumented) is actually true.
 
Last edited:
Nov 2, 2008
237
2
I mainly use extproc here, down to regina scripts. Is there a reason you could not write a batch processor?
 
Similar threads
Thread starter Title Forum Replies Date
redwdc A comment on using shell folders Support 1
Jesse Heines Using Regular Expressions with the REN commanc Support 8
R WAD Unusable state when using Chinese characters Support 3
Joe Caverly Using TYPE with non-English text Support 22
L Using TCC.exe through an SSH connection Support 3
Joe Caverly Using @PSHELL from @EVAL Support 8
Jay Sage Command Will Not Run Using Short Name of Path Support 5
Jay Sage Cannot Postion Cursor in Command Line Using Mouse Support 7
MikeBaas Using the debugger Support 2
Joe Caverly Multiple Text Searches at once using FFIND or TPIPE Support 4
Dick Johnson Using the @instr function Support 5
Joe Caverly What version and Windows OS are you using? Support 3
Craig Fitzgerald Problems using tcstart.btm Support 3
R How to? Append files in multiple subfolders using copy? Support 8
M Ctrl-C when using command line history does nothing Support 2
Joe Caverly Using a Directory Alias with @iniwrite fails Support 14
C French accents using msgbox Support 4
C "Failed to update the system registry. Please try using REGEDIT" Support 3
x13 Problem listing repository files using DIR http(s)://... Support 8
R Regex using ^ Support 2
cxxl WAD Mouse movement sluggish when using TCC list Support 3
jfalch WAD internal "which" should check for FILEEXIST when using AppPaths entry Support 8
D How to? Scale font in TCC using wheel mouse or other means Support 2
fpefpe Documentation copy/move using /c or /u Support 2
gschizas Fixed Using codepage 65001 (UTF-8) breaks non-ASCII characters Support 8
D How to? Use typed envars using regex. Support 3
epement Using "everything" Support 10
U Installing the Compaq Visual Fortran 6.0 compiler using Take Command Support 8
Alexander WAD The number of files and dirs are multiplied when using multiple wildcards Support 6
T using bottom line for status bar Support 3
A How to? How do you launch TCC/LE using the already-open instance? Support 5
rps Fixed Using last argument variable ! Support 5
M Incorrect ARGV1 when using linux-style paths Support 4
D How to? Using a custom ini file with TCC from Take Command Support 7
thedave WAD Unable to type various characters using Windows 8's onscreen keyboard Support 7
D Documentation Using "send all input to other tabs" Support 11
Joe Caverly Word Count using TPIPE Support 10
Phileosophos Fixed Option Dialog Hangs when Using Help Support 7
MickeyF problem using COM object in VBScript from v16 x64 TCC but not from v15 32-bit TCC Support 4
S How to? How do I distinguish missing source file from download error when using HTTP? Support 6
Jay Sage Using EVERYTHING Command in TCMD15 Support 5
Charles Dye Odd behavior after using OPTION "Advanced" tab Support 2
T How to? Using FOLDERMONITOR 1 event causes multiple trigger(ing)s Support 8
samintz WAD FILEWRITE using SMOPEN Support 1
ehab aboudaya How to? 2 GUI questions and return HWND using TakeCommandIPC Support 3
R Fixed Using %~dp1 for paths with unavailable drives Support 6
C Using dif. sending addresses with sendmail Support 11
R TC 13 / Using TCDIALOG to exit commands Support 4
epement Video tutorials of using Take Command Support 2
electrotype Error using TCC: "Label not found" Support 6

Similar threads