如何从批处理执行中排除文件?

Posted

技术标签:

【中文标题】如何从批处理执行中排除文件?【英文标题】:How do I exclude a file from batch execution? 【发布时间】:2021-07-30 15:46:09 【问题描述】:

我编写了一个批处理文件,它使用 javac 编译所有 .java 文件:

javac *.java

但后来我添加了另一个我不想编译的文件。例如,我们将其命名为ignore.java

在批处理编程中有没有办法从代码执行中排除某些内容?

类似:

javac *.java /except ignored.java

【问题讨论】:

使用for 循环然后使用if not "%%i" == "ignored.java"for %%i in (*.java) do if /i not "%%~i" == "ignored.java" javac "%%~i" 那行得通。我尝试了类似的方法,但由于我之前从未编写过批处理,因此无法正确使用语法:p。您想将其作为答案提交,以便我接受吗? 【参考方案1】:

另一种方法是使用参数文件

创建一个名为 classes 的文件,其中只包含要编译的文件,如下所示:

MyClass1.java
MyClass2.java
MyClass3.java

你可以这样做:

dir *.java /a:-d /b|find /i /v "ignored.java">classes

然后,运行 javac 命令如下:

javac @classes

由于classes文件中没有提到ignore.java,所以会略过

【讨论】:

感谢您的回答。该解决方案确实解决了上述问题,但它不可扩展。如果它需要在包含数百个 .java 文件的文件夹上运行,那么编写一个包含所有需要编译的文件的文件而不是仅使用单个 javac 命令列出它们是没有意义的。 @MiroslavMilanov 这样做有好处。使用@filename 意味着您可以将几千个文件作为一个进程处理,即您只运行一个 javac.exe 进程,其中包含长度不受限制的文件名参数列表。 for 循环方法将为它找到的每个文件运行一个 javac 进程,这可能是密集的。此外,写入单个文件是一个非常快速的过程,并且不太可能增加任何明显的开销。请针对不同数量的文件尝试针对 for 循环一的这种方法,并比较它们的执行时间,它们可能会让您感到惊讶。 这实际上是一个非常好的观点。我确实注意到带有另一个问题的命令是一次计算一个,我认为这个解决方案也是一样的。谢谢你指出这一点。我收回关于可扩展性的话,这要好得多。【参考方案2】:

cmd 需要一个 for 循环来执行 for 每个项目。 if 可以用来比较。这将为您提供以下解决方案:

@echo off
for %%i in (*.java) do if /i not "%%~i" == "ignored.java" javac "%%~i"

还要注意if/i 开关,它使比较不区分大小写。

【讨论】:

以上是关于如何从批处理执行中排除文件?的主要内容,如果未能解决你的问题,请参考以下文章

csharp 用于从csproj unity 2018中排除着色器文件的后处理器生成

Oracle 完全导出,排除而不使用 par 文件

如何从 ack (ack-grep) 中排除特定文件?

“(在此时出现意外”是从Powershell运行批处理文件时)

如何在一个批处理文件中从一个源文件夹执行两个 ROBOCOPY 语句到两个目标文件夹?

如何使用 setuptools 和 setup.py 从包中排除单个文件