如何从批处理执行中排除文件?
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中排除着色器文件的后处理器生成
“(在此时出现意外”是从Powershell运行批处理文件时)