在CMD中使用if条件

3

编辑:根据npocmaka和magoo的建议,我解决了我的问题。现在我明白是缩进引起了这个问题,你们能否建议我如何使我的代码在未来更加清晰?

这是我的批处理文件:

    @echo off
    setlocal enabledelayedexpansion

    rem set lang pre-requisites
    rem Purpose can be 'test' or 'deploy'
    SET purpose="test"
    SET lang="English-India"
    SET lang_code="EnIn"

    rem if purpose is test then the folder will be EnInP101M2Tsub, if purpose is deploy then EnInP101M2DFull
    if "%purpose%"=="test"( SET folder=="%lang_code%P101M2Tsub" )
    else if "%purpose%"=="deploy"( SET folder=="%lang_code%P101M2DFull" )

    rem set required paths here
    SET audio="C:\Users\Administrator\..path..\%lang%\%purpose%\BGM\M2\%folder%\*.wav"
    SET source="C:\Users\Administrator\Downloads\Matt_Trial\..path..\%lang%\%purpose%\BGM\M2"
    SET target="C:\Users\Administrator\Downloads\Matt_Trial\..path..\%lang%\%purpose%\BGM\M3\*"

    rem copying the data
    xcopy  %source% %target% /e /i /h
    rem copying audio files into the other folders
    for /d %%a in (%target%) do copy %audio% "%%a"

    rem renaming M3 folders
    cd %target%
    for /d %%a in (*) do (
      set "p=%%a"
      set "fp=!p:~0,8!" & set "tp=!p:~10!"
      ren %%a !fp!M3!tp!
    )

**为了您的理解** 我在父文件夹中有2个文件夹(M1,M2,M3)。 步骤1:我正在将M2中的内容复制到一个新文件夹M3中。 步骤2:我需要将M2下的一个包含我的音频的文件夹的内容复制到M3中的所有文件夹中。 步骤3:我重命名M3下的文件夹。

我希望我表达清楚了。 我必须根据设置的变量找出音频路径。我需要if条件部分的帮助。目前我一直收到“系统找不到指定的文件”的错误。请帮帮我!

4个回答

3

有几个错误。

SET= 后面会包含 ",除非你使用的是 `SET "var=data"`,这是为了确保行尾的空格不包含在分配的数据中。

= 后面的任何字符都将被包含(如果它们对批处理有特殊含义,则需要进行“转义”,因此 set var==data 将包含分配的数据中的第二个 =

你没有陷入变量中的空格问题 - 语法 set var =data 将设置一个名为 varspace 而不是 var 的变量。

IF 语句的第二个操作数和 ((如果使用)之间必须有一个空格(严格来说,我认为这是一个分隔符)。

同样,ELSE 子句必须是 )SpaceelseSpace( - 所有这些字符必须在同一行上。这个字符序列不能被打破。

在你的 IF 中,你使用了 "%purpose%"。由于 purpose 设置为 "test",因此这将被评估为 ""test"",这很可能会令人困惑,因此除非你有一个非常好的理由,否则不要在分配的数据中包含 "


感谢您的建议。注意到了 :) - Matt
非常感谢您再次帮助我。我非常珍视任何有关使代码更清晰的建议,以便为未来做好准备。这对我来说将非常有帮助。 - Matt

1

这个:

  @echo off
    setlocal enabledelayedexpansion

    rem set lang pre-requisites
    rem Purpose can be 'test' or 'deploy'
    SET purpose="test"
    SET lang="English-India"
    SET lang_code="EnIn"

    rem if purpose is test then the folder will be EnInP101M2Tsub, if purpose is deploy then EnInP101M2DFull
    if "%purpose%"=="test"( SET folder=="%lang_code%P101M2Tsub" )
    else if "%purpose%"=="deploy"( SET folder=="%lang_code%P101M2DFull" )

看起来应该像这样(因为你只有两个选项...)

   @echo off
    setlocal enabledelayedexpansion

    rem set lang pre-requisites
    rem Purpose can be 'test' or 'deploy'
    SET "purpose=test"
    SET "lang=English-India"
    SET "lang_code=EnIn"

      rem if purpose is test then the folder will be EnInP101M2Tsub, if purpose is deploy then EnInP101M2DFull
       if "%purpose%"=="test" (  
        SET "folder=%lang_code%P101M2Tsub" 
       ) 

       if "%purpose%"=="deploy" ( 
         SET "folder=%lang_code%P101M2DFull"
       )

       echo %folder%
       endlocal

你不能以 else 开始一行,并且使用双重 = 时 set 不起作用。由于变量值中有引号,因此你的比较不正确。

感谢您的及时回复。我实际上已经尝试过了。但是当我运行我的批处理文件时,会出现一个错误,提示命令的语法不正确。 - Matt
谢谢!事实证明问题确实是缩进!! - Matt
非常感谢您再次帮助我。我非常珍视任何有关使代码更清晰的建议,以便为未来做好准备。这对我来说将非常有帮助。 - Matt

1
我还没有50个声望,所以只能通过回答来评论。
当我遇到批处理文件问题时,我发现将@ECHO OFF行加上REM很有帮助。
然后创建一个指向批处理文件的快捷方式,并更改“目标”字段以将输出导入文本文件。
因此,如果您的批处理程序位于C:\ test \ mybatch.bat,则在C:\ test \中创建批处理程序的快捷方式。
接下来,右键单击快捷方式并选择“属性”。在“快捷方式”选项卡下,在目标字段的文本末尾添加以下内容。 >> output.txt 运行快捷方式,将所有命令和错误保存到output.txt文件中,您可以查看导致问题的原因,例如未设置变量。

我还没有50个声望,所以只能通过回答来评论。 你的声望比我高 :) - Matt
嘿!那听起来是一种有趣的故障排除方式。如果我遇到问题,我会实施这个方法。再次感谢。非常感谢您的帮助。 - Matt

0

你必须使用圆括号。记住,if .... () else (不可分割地链接到单行(每个都必须在单行中)。

...
if "%purpose%"=="test" (
    SET "folder=%lang_code%P101M2Tsub"
) else (
    if "%purpose%"=="deploy" (
        SET "folder=%lang_code%P101M2DFull" 
    )
)
...

注意: 我在你的作业中发现了额外的问题:
  1. 多余的等号。
  2. 双引号。

假设 Lang_code 等于 -EN-

SET folder=="%lang_code%P101M2Tsub"
Echo [%folder%]

它展示了。
[="-EN-P101M2Tsub"]

正确的方式应该是:

SET "folder=%lang_code%P101M2Tsub"
Echo [%folder%]

它显示出来了。
[-EN-P101M2Tsub]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接