使用Windows批处理文件的单行多个命令

26 浏览
0 Comments

使用Windows批处理文件的单行多个命令

我试图理解批处理文件中单个命令行中多个命令的工作原理。\n

dir & md folder1 & rename folder1 mainfolder

\n还有其他类似命令的情况,但是用&替换为&&。\ndir && md folder1 && rename folder1 mainfolder\n\n1. 这两种情况有什么区别?\n


\n我还想问的另一件事:\n单行命令batch.bat:\n

dir & md folder1 & rename folder1 mainfolder

\n多行命令batch.bat:\n

dir
md folder1
rename folder1 mainfolder

\n2. 这个单行命令和多行命令在批处理文件程序方面是否相等?\n


\n还有一件我想知道的事情:\n3. 如果我从main.bat中调用其他批处理文件,它们是独立且同时运行的吗?主批处理文件不会等待其他批处理文件中的程序结束吗?如何做到这一点?

0
0 Comments

问题原因:在Windows批处理文件中,使用多个命令的单行命令时,可能会出现问题。这种情况下,命令可能无法正确执行或以意外的方式执行。在上述示例中,使用ScriptRunner.exe运行了多个命令,但命令之间的关系和执行顺序不清楚,导致可能出现错误或不正确的结果。

解决方法:为了解决这个问题,可以使用以下方法之一:

1. 使用分行命令:将单行命令拆分为多行,并确保每个命令以独立的行开始和结束。这样可以明确每个命令的执行顺序和关系,避免混淆和错误。

2. 使用批处理命令分隔符:在命令之间使用批处理命令分隔符(例如“&”、“&&”或“|”)来指示命令的执行顺序和关系。这样可以确保命令按照指定的顺序执行,并且每个命令都能够正确地接收前一个命令的输出。

3. 将多个命令放入批处理文件中:将所有命令放入一个单独的批处理文件中,并在需要执行这些命令的地方调用该文件。这样可以确保命令以正确的顺序执行,并且可以重复使用这些命令。

在使用Windows批处理文件时,如果需要在单行中使用多个命令,需要注意命令之间的关系和执行顺序。通过使用分行命令、批处理命令分隔符或将命令放入单独的批处理文件中,可以避免出现问题,并确保命令的正确执行。以上提到的解决方法可以根据具体情况选择使用。

0
0 Comments

在Windows批处理文件中,使用&将两个命令连在一起,这意味着无论第一个命令的结果如何,都会执行两个命令。&右侧的命令会在&左侧的命令完成后执行,与前一个命令的成功或失败无关,即与前一个命令的退出/返回值无关。

&&表示对第二个命令进行条件执行。只有在第一个命令成功执行(即以返回代码0退出)的情况下,才会执行第二个命令。

对于dir & md folder1 & rename folder1 mainfolder,它等同于以下三个命令的执行:

dir
md folder1
rename folder1 mainfolder

可以使用以下多行替代dir && md folder1 && rename folder1 mainfolder

dir

if not errorlevel 1 (

md folder1

if not errorlevel 1 (

rename folder1 mainfolder

)

)

其中,if not errorlevel 1表示前一个命令的退出代码不大于0,因为dirmd命令退出代码为0(成功)或大于0(失败)(几乎所有命令和控制台应用程序都是如此),而0是成功的退出代码,因此这是一种正确的测试dirmd成功执行的方法。

在混合使用无条件操作符&和条件操作符&&||时,必须小心执行顺序,因为执行顺序不一定是命令行上命令的顺序。

例如:dir "C:\Users\%UserName%" /AD 2>nul || dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%"

该命令行的执行顺序如下:

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 dir "%UserProfile%" /AD
echo User profile path: "%UserProfile%"

无论第一个DIR的执行结果如何,ECHO命令都会执行,而第二个DIR仅在第一个DIR失败(如在Windows XP上)或用户的个人资料文件夹不在C:驱动器上或根本不存在Users文件夹时才会执行。

如果要在第二个DIR的结果与第一个DIR无关时,才执行ECHO,则需要在ECHO之前添加括号。

例如:dir "C:\Users\%UserName%" /AD 2>nul || ( dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" )

该命令行的执行顺序如下:

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 (
    dir "%UserProfile%" /AD
    echo User profile path: "%UserProfile%"
)

至于第三个问题的答案,请参考我在How to call a batch file in the parent folder of current batch file?中对在批处理文件中使用callstart命令以及不使用这两个命令的区别进行解释。

0