Can't run .bat files properly (Windows 10) - windows

Here is my test.bat
#!/bin/bash
#set the STRING variable
SET STRING=Hello World
#Print the contents of the variable to the screen
echo $STRING
pause
When I run test.bat on Windows 10 I get this output:
C:\Workspace\mcc-batch-jobs>#!/bin/bash
'#!' is not recognized as an internal or external command,
operable program or batch file.
C:\Workspace\mcc-batch-jobs>#set the STRING variable
'#set' is not recognized as an internal or external command,
operable program or batch file.
C:\Workspace\mcc-batch-jobs>SET STRING=Hello World
C:\Workspace\mcc-batch-jobs>#Print the contents of the variable to the screen
'#Print' is not recognized as an internal or external command,
operable program or batch file.
C:\Workspace\mcc-batch-jobs>echo $STRING
$STRING
C:\Workspace\mcc-batch-jobs>pause
Press any key to continue . . .
I can't figure it out. I've checked my PATH, installed cygwin, looked over several Stackoverflow posts, and can't seem to get the script to work. The script was created as a simple test and nothing more.

From my comment, this is a batch file for Windows, (it usually has a .cmd extension but may use .bat instead):
#ECHO Off
SET "STRING=Hello World"
REM Print the contents of the variable to the screen
ECHO %STRING%
PAUSE

Related

Opening URL works in Run box but not in batch script

When I open a URL through the Run box it executes successfully, but not when put in a batch script.
When I try to run this URL in a batch script
com.epicgames.launcher://apps/fn%3A4fe75bbc5a674f4f9b356b5c90567da5%3AFortnite?action=launch&silent=true
it returns this error
com.epicgames.launcher://apps/fn%3A4fe75bbc5a674f4f9b356b5c90567da5%3AFortnite?action=launch&silent=true
'com.epicgames.launcher:' is not recognized as an internal or external command,
operable program or batch file.
'silent' is not recognized as an internal or external command,
operable program or batch file.
but when I run it in the Run box, it works normally.
A batch file can only execute .exe, .com and other batch files.
Use the start command to launch other things:
#echo off
start http://example.com/?foo^&bar
And as noted in the comments, you need to deal with special characters. % must be changed to %% and & to ^& etc...

Windows batch file: pathname with "&" interpreted as two commands

I have a batch file which gets its own short pathname (to eliminate spaces, which gcc doesn't like) for use in subsequent commands:
set base=%~d0%~sp0
This works fine for most cases; for example, if the batch file is located in C:\Program Files, the value of %base% will be C:\PROGRA~1, and gcc is happy.
However, it doesn't work if the batch file is in a directory with "&" in the name. If it is in a directory called "C:\Here & There", the command above expands to
set base=C:\HERE&T~1\
which is treated as two commands, producing the error message 'T~1\' is not recognized as an internal or external command, operable program or batch file.
If I put quotes around it:
set base="%~d0%~sp0"
Then the command works, and the value of %base% is "C:\HERE&T~1\" (including the quotes). But then the quotes break something else further on in the file when I use it to build a Java classpath:
java -cp .;"C:\HERE&T~1\"Jars\* foo
which says "The system cannot find the file specified" (relating to "C:\HERE&T~1\"Jars\* in the classpath).
Can anyone suggest a way around this Microsoft mess?
[Edit]
As requested by Mofi below, here is a minimal reproducible example batch file:
#echo off
set base=%~d0%~sp0
echo %base%
If this is executed in a directory called "C:\Here & There", I would like the output to be
C:\HERE&T~1
without quotes or other extraneous output.
Here is the actual output when using CMD.EXE as the shell:
'T~1\' is not recognized as an internal or external command,
operable program or batch file.
C:\HERE
If I change the line #echo off to #echo on to show the commands as they are executed, I get this (where "C:\Here & There>" is the prompt, followed by the actual command being echoed prior to execution):
C:\Here & There> set base=C:\HERE & T~1\
'T~1\' is not recognized as an internal or external command,
operable program or batch file.
C:\Here & There> echo C:\HERE
C:\HERE
Since the quotes should not be part of the value, the correct SET command would be
set "base=%~d0%~sp0"
There are two problems, the first is the expansion in the SET command.
It can be avoided by quotes around the expression.
set "base=%~dps0"
The second problem is the echo, it can be avoided by quotes, too.
echo "%base%"
But then the quotes are visible, too.
In a batch file, this can be solved with delayed expansion:
set "base=%~dps0"
setlocal EnableDelayedExpansion
echo !base!
But on the command line, the delayed expansion mode can not be modified by setlocal, it can only be set by the /v:on option when cmd.exe starts
cmd /v:on
set "base=%~dps0"
echo !base!

Absolute path needed in batch file? [duplicate]

This question already has answers here:
What is the reason for "X is not recognized as an internal or external command, operable program or batch file"?
(4 answers)
What does %~dp0 mean, and how does it work?
(7 answers)
What is the reason for batch file path referenced with %~dp0 sometimes changes on changing directory?
(6 answers)
Closed 4 years ago.
I have a Windows batch file that calls the python interpreter:
python -m ...
That works. But now I have a second batch file that calls the first batch file. When I run this batch file, I get an error:
'python' is not recognized as an internal or external command,
operable program or batch file.
I don't understand why the second batch file doesn't work.
If it helps to have a concrete example, here's one:
In helloworld.py
print("Hello, world!")
In batch1.cmd
#echo off
echo About to call python...
python -m helloworld
pause
exit
In batch2.cmd
#echo off
set "path=%~dp0batch1.cmd"
start "" %path%
Output:
About to call python
'python' is not recognized as an internal or external command, operable program or batch file.
Press any key to continue . . .
You are completely breaking the system variable %path% by setting it in the batch. Now your system cannot find python anymore.
Simply change second batch to:
#echo off
set "mypath=%~dp0batch1.cmd"
start "" %mypath%
To explain the %path% variable better. It holds the path to any possible file locations to search for files to execute or open without the need to have the full path specified each time by a user. By running a command in cmd like python, it first checks the current directory where the batch started in, if python.exe is not there, it will search each semicolon seperated path in the %path% variable. When you set a new %path% variable it only knows of the newly set path and cannot find python to execute and you get the most common cmdline error on windows.
On another note, if you want to start batch1 in the same window, perhaps consider calling batch instead of starting it
call "%mypath%"

starting a bat script from bash under windows

I am trying to start a .bat file from gow bash. I can sucessfully start a batch and return to bash with the following (I am in C:\tmp\a\ directory), the content of the file a.bat file consists a single command cd (to print the current working directory):
$ cat a.bat
cd
$ cmd "/C a.bat"
c:\tmp\a>cd
c:\tmp\a
$
Now if I try to start the program from c:\tmp (one level higher in the hierarchy of directory structure), I get an error:
$ cmd "/C a\\a.bat"
'a' is not recognized as an internal or external command,
operable program or batch file.
$ cmd '/C a\a.bat'
'a' is not recognized as an internal or external command,
operable program or batch file.
$ cmd '/C a/a.bat'
'a' is not recognized as an internal or external command,
operable program or batch file.
How can I start a batch script given a path to it, and return to bash?
I guess I found a very simple solution:
Add a dot before /C
cmd ". /C a\a.cmd"
After that gow (and cygwin and alikes) stop treating the argument as containing paths and converting it to POSIX paths.
And cmd ignores everything up to /C (well, almost everything, I think).
a.cmd:
#echo off
echo it's working
output:
bash-3.1$ cmd ". /C a\a.cmd"
it's working
bash-3.1$
[Update]
After some research I found that POSIX path conversion has a very clean description of conversion rules.
In your case the rule An argument with a leading / is converted up to the first /.. seems to be applied.
Conversion results in changing '\' to '/'. So, you get a/a.cmd, that is a with a switch /a.cmd. And this results in the observed error, of course.
The link above addresses MSYS and seems to be a bit outdated, but I've checked some of the rules in bash from my fresh Git for Windows installation (based on MSYS2), and they look working as described.
After a bit of research and posting questions to other forums I found the following additional info to run the job "correctly":
cmd //D . //C "a\a.cmd"
References:
Github issue #244, Unix to Windows path translation may corrupt command switches/arguments
Github issue #243, when bash starts a cmd, it adds a buggy double quote symbol at the end of the line

Batch script does not recognize Windows environment variable [duplicate]

This question already has answers here:
Windows Batch error: "'ping' is not recognized as an internal or external command operable program or batch file."
(3 answers)
Closed 6 years ago.
I have batch script like this, let's say test.bat. What it does is: cd into a directory path, and apply "make" commands:
set path=%SRC_PATH%
echo %path%
cd /d %path%
make clean
make all
When I run test.bat from a Windows Command Shell, I get following error despite I defined path to make.exe in Windows Environment Variable
'make.exe' is not recognized as an internal or external command,
operable program or batch file.
Note, I do not see this issue, when I use Windows command line and entered all the commands manually. Issue is only when I put the commands into a batch file.
Any pointers would be appreciated.
thanks.
You dont need to write this
set path=%SRC_PATH%
echo %path%
cd /d %path%
Just enter the path of make.exe in PATH Variable in environment variables..
PATH Variable already carries value so just add semi colon to the end enter the full folder path of make.exe(JUST FOLDER PATH)
now just calling make will work.

Resources