用于查找和替换多个子文件夹中文件的 Bat 脚本 - 将 .java 文件替换为特定文件夹中的 .class 文件
Bat script to find and replace files in multiple subfolders - replace .java files with .class files from specific folder
我是 windows 批处理脚本的新手.. 请帮助解决这个问题
我的文件结构如下::
dir1:
c:\workspace\changeset\com\folder
子文件夹1
- one.java
子文件夹-2
- two.java
dir2:
c:\workspace\target\class\com\folder
子文件夹1
- one.class
子文件夹2
- two.class
子文件夹3
- three.class
需要在相应的子文件夹中查找并替换 dir1 文件,即 dir2 文件中的 one.java 和 two.java即 one.class 和 two.class(需要用特定文件夹中的 .class 文件替换某些 .java 文件)
非常感谢您的帮助。
谢谢
阿俊
for /f "delims=" %%a in ('dir /b /a-d "c:\workspace\changeset\com\folder\*.java"') do (
if exist "c:\workspace\target\class\com\folder\%%~na.class" (
echo copy "c:\workspace\target\class\com\folder\%%~na.class" "c:\workspace\changeset\com\folder\%%a")
)
所需的 COPY 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将ECHO COPY
更改为COPY
以实际复制文件。附加 >nul
以禁止报告消息(例如 1 file copied
)
请注意,直接从提示执行和使用批处理文件执行是不同的。 metavariable
(循环控制变量)%%x
对于批处理行必须引用为 %%x
,如果从命令提示符执行则必须引用为 %x
。由于从提示中重复执行包含 for
的行毫无意义(创建批处理文件更容易),因此我使用 post 批处理文件版本。如果需要,用户有责任针对直接提示进行调整。
读取 /b
基本格式 /a-d
中没有目录的每个文件名,并将文件名+扩展名分配给 %%a
.
如果另一个目录中存在名为thenamepartofthefile.class的文件,则将that文件复制到第一个目录.
请post解决整个问题。这种方法可以从根本上改变,就像在这种情况下一样。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir1=U:\sourcedir\changeset"
SET "sourcedir2=U:\sourcedir\target"
FOR /f "delims=" %%a IN (
'dir /b /s /a-d "%sourcedir1%\*.java" '
) DO (
SET "javadir=%%~dpa"
SET "classfile=!javadir:%sourcedir1%=%sourcedir2%!%%~na.class"
IF EXIST !classfile! ECHO COPY "!classfile!" "%%a"
)
GOTO :EOF
您需要更改 sourcedir1
和 sourcedir2
的设置以适合您的情况。
本质上,相同的方法和相同的评论都是消息。不同之处在于此过程使用 dir
列表中的文件和子目录,并在导出 .class
文件的预期名称时替换目录名的第一部分。
我是 windows 批处理脚本的新手.. 请帮助解决这个问题
我的文件结构如下::
dir1: c:\workspace\changeset\com\folder
子文件夹1
- one.java
子文件夹-2
- two.java
dir2: c:\workspace\target\class\com\folder
子文件夹1
- one.class
子文件夹2
- two.class
子文件夹3
- three.class
需要在相应的子文件夹中查找并替换 dir1 文件,即 dir2 文件中的 one.java 和 two.java即 one.class 和 two.class(需要用特定文件夹中的 .class 文件替换某些 .java 文件)
非常感谢您的帮助。
谢谢 阿俊
for /f "delims=" %%a in ('dir /b /a-d "c:\workspace\changeset\com\folder\*.java"') do (
if exist "c:\workspace\target\class\com\folder\%%~na.class" (
echo copy "c:\workspace\target\class\com\folder\%%~na.class" "c:\workspace\changeset\com\folder\%%a")
)
所需的 COPY 命令仅 ECHO
ed 用于测试目的。 确认命令正确后,将ECHO COPY
更改为COPY
以实际复制文件。附加 >nul
以禁止报告消息(例如 1 file copied
)
请注意,直接从提示执行和使用批处理文件执行是不同的。 metavariable
(循环控制变量)%%x
对于批处理行必须引用为 %%x
,如果从命令提示符执行则必须引用为 %x
。由于从提示中重复执行包含 for
的行毫无意义(创建批处理文件更容易),因此我使用 post 批处理文件版本。如果需要,用户有责任针对直接提示进行调整。
读取 /b
基本格式 /a-d
中没有目录的每个文件名,并将文件名+扩展名分配给 %%a
.
如果另一个目录中存在名为thenamepartofthefile.class的文件,则将that文件复制到第一个目录.
请post解决整个问题。这种方法可以从根本上改变,就像在这种情况下一样。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir1=U:\sourcedir\changeset"
SET "sourcedir2=U:\sourcedir\target"
FOR /f "delims=" %%a IN (
'dir /b /s /a-d "%sourcedir1%\*.java" '
) DO (
SET "javadir=%%~dpa"
SET "classfile=!javadir:%sourcedir1%=%sourcedir2%!%%~na.class"
IF EXIST !classfile! ECHO COPY "!classfile!" "%%a"
)
GOTO :EOF
您需要更改 sourcedir1
和 sourcedir2
的设置以适合您的情况。
本质上,相同的方法和相同的评论都是消息。不同之处在于此过程使用 dir
列表中的文件和子目录,并在导出 .class
文件的预期名称时替换目录名的第一部分。