我的操作系统是Windows Vista.我需要一个".bat"文件,我需要检查用户是否输入任何命令行参数.如果那么,如果参数等于-b那么我会做一些事情,否则我将标记"无效输入".如果用户没有输入任何命令行参数,那么我会做一些事情.我创建了以下.bat文件.它适用于-b和不等于-b案例 - 但是当用户没有传递任何命令行参数时它会失败.
我总是得到错误:
GOTO was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这里我做错了什么?
ECHO OFF
CLS
ECHO.
IF [%1]==[/?] GOTO BLANK
IF %1=="-b" GOTO SPECIFIC
IF NOT %1=="-b" GOTO UNKNOWN
:SPECIFIC
ECHO SPECIFIC
GOTO DONE
:BLANK
ECHO No Parameter
GOTO DONE
:UNKNOWN
ECHO Unknown Option
GOTO DONE
:DONE
ECHO Done!
Run Code Online (Sandbox Code Playgroud) 我正在尝试在批处理文件中使用以下验证逻辑,但即使没有为批处理文件提供参数,"使用"块也永远不会执行.
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我需要使用cmd.exe命令行(从gyp构建工具调用cmd.exe)来确定是否定义了环境变量.我怎样才能做到这一点?我可以假设变量值不包含单引号或双引号,但不能假设启用了命令扩展.
我尝试了以下内容,它在.bat文件中运行良好,但在命令行上直接输入时失败:
IF "%UNDEFINED%" == "" (echo yes)
Run Code Online (Sandbox Code Playgroud)
当该确切行在.bat文件中并执行时,我将其yes视为输出.当我在命令行上键入它时,输出为空.我在Windows XP SP3上测试这个,虽然我的同事在Windows 7上看到相同的结果.这是http://support.microsoft.com/kb/121170和http://www.robvanderwoude.com/建议的方法battech_defined.php.我不想使用,IF DEFINED UNDEFINED (echo yes)因为如果禁用了命令扩展,那将无法使用.
以下帖子中的最高投票回答让我相信这个问题与"CmdLineParser"与"BatchLineParser"中百分比扩展的处理方式有关,但仍然没有让我找到解决方案: 如何Windows命令解释器(CMD.EXE)解析脚本吗?
正如在另一个线程中所讨论的如何避免cmd.exe解释shell特殊字符,如<> ^ 从命令行获取所有参数并不容易.
一个简单的
set var=%1
set "var=%~1"
Run Code Online (Sandbox Code Playgroud)
如果你有这样的要求,还不够
myBatch.bat abc"&"^&def
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案,但它需要一个临时文件,它也不是防弹.
@echo off
setlocal DisableDelayedExpansion
set "prompt=X"
(
@echo on
for %%a in (4) do (
rem #%1#
)
) > XY.txt
@echo off
for /F "delims=" %%a in (xy.txt) DO (
set "param=%%a"
)
setlocal EnableDelayedExpansion
set param=!param:~7,-4!
echo param='!param!'
Run Code Online (Sandbox Code Playgroud)
它失败了像myBatch.bat%a,它显示4而不是%a
在这种情况下,简单的回声%1将起作用.
这显然是for循环,但我不知道如何改变它.
也许存在另一个简单的解决方案
我不需要这个来解决实际问题,但我喜欢在每种情况下都是防弹的解决方案,而不仅仅是在大多数情况下.
我正在尝试向批处理文件添加一些可选参数,但遇到了问题,因为该SHIFT命令不影响all-arguments变量%*。
有谁知道如果我必须使用,我如何允许可选的批处理文件参数%*?
例如,一个简单的示例,它仅将带有和不带有换行符的参数打印到屏幕上,使用可选参数来确定哪个:
@echo off
if (%1)==() goto usage
if (%1)==(/n) goto noeol
goto eol
:eol
echo %*
goto :eof
:noeol
shift
call showline %*
goto :eof
:usage
echo Prints text to the screen
echo > %0 [/n] TEXT
echo /n to NOT print a new-line at the end of the text
goto :eof
Run Code Online (Sandbox Code Playgroud)