我的代码中出现语法错误

时间:2018-04-10 15:10:14

标签: windows batch-file cmd

我正在为家庭作业写一个简单的批处理文件,它应该检查是否定义了两个变量。我让它工作正常,然后我意识到需要检查两个变量,而不是一个。它仍然有效,但它会出现语法错误。有谁知道为什么?

Collecting Twisted==17.5.0 (from -r /srv/wcsftp/master/wcsftp/requirements.txt (line 1))
  Using cached Twisted-17.5.0.tar.bz2
    Complete output from command python setup.py egg_info:
    Download error on https://pypi.python.org/simple/incremental/: [Errno 101] Network is unreachable -- Some packages may not be found!
    Couldn't find index page for 'incremental' (maybe misspelled?)
    Download error on https://pypi.python.org/simple/: [Errno 101] Network is unreachable -- Some packages may not be found!
    No local packages or download links found for incremental>=16.10.1

3 个答案:

答案 0 :(得分:1)

尝试这样。当没有命令行参数时会发生错误,并且首先将if解释为if == "" - 这是错误的语法:

:: 04/09/18
:: checkVars.bat
:: Checks if a variable name is defined
@echo off
setlocal enableDelayedExpansion
if "%~1" == "" (
  echo Usage: %0 varname1 [varname2 [..]]
  exit /b
) else (
  goto check
)


:check
set "arg=%~1"
if not "%~1" equ "" (
    if defined !arg! (
        echo "'%~1' is defined"
    ) else (
        echo "'%~1' is not defined"

    )
) else (
    goto :endcheck
)

shift /1
goto check
:endcheck

你也会遇到与if defined相同的问题。要使其更加强大,你可以使用延迟扩展,而且你需要一种方法来退出检查,否则你将会点击一个永无止境的循环。使用goto进行操作将会影响脚本的性能。

答案 1 :(得分:1)

或者您可以使用For循环:

Rem 04/09/18
Rem checkVars.bat
Rem Checks if variable names are defined
@Echo Off
If "%~1"=="" (Echo Usage: "%~0" "varname1" "varname2" etc. & Exit /B)
For %%A In (%*) Do If Defined %%~A (Echo "%%~A is defined"
) Else Echo "%%A is not defined"
Pause

如果它们包含空格,你可能只需用varname1varname2等用双引号括起来(但这总是很好的做法)。

答案 2 :(得分:0)

假设您只提供一个参数var1

代码将检查“%1”,它将是var1,然后执行shift,用% n + 1 <替换每个% n / em> - 只有一个参数,%2为空,所以现在%1为空,因此您的代码将返回:check但尝试执行if defined ((从%1现在为空) - 这是语法错误。

修复现有代码的简便方法是

:: 04/09/18
:: checkVars.bat
:: Checks if a variable name is defined


if "%1" == "" (
  echo "Usage: %0 varname1"
  exit /b
) else (
  goto check
)


:check
if defined %1 (
    echo "%1 is defined"
) else (
    echo "%1 is not defined"    
)

shift /1
if "%1" == "" (
  echo "Finished"
  exit /b
)
goto check

这样只有在check存在

时才会循环回%1

注意:在此行的两个个案例中,请使用

if "%1" == "" (

if %1 == "" (

因为==运算符非常直观。 两个侧的字符串必须相同才能达到等效性。