0

I'm new to cmd, having trouble with this:

md "C:\kysumicomp"
for /f "usebackq" %%a in (`CALL DIR /b /s "C:\Program Files" ^| FIND "javac.exe"`) do
   copy "%%a" "C:\kysumicomp"
pause

What I am trying to achieve is a batch file that that will find the javac.exe file then copy it to C:\kysumicomp but I don't want it to be an absolute path so if my java updates the batch will still work.

4

3 回答 3

1

中的默认字段分隔符for /f是空格和制表符。要解决您的问题,您必须重新定义分隔符。与永远不会出现在路径中的字符一起使用delims=,例如|. 还有另一个问题。想象一下有一个目录c:\Program Files\javac.exe\。您的代码会将该目录中的所有文件复制到 C:\kysumicomp。但是您实际上不必使用find,dir就足够了:

md "C:\kysumicomp"
for /f "delims=| usebackq" %%a in (`dir /b /s "C:\Program Files\javac.exe"`) do (
   copy "%%a" "C:\kysumicomp"
)
pause

Christian的解决方案也是一个不错的解决方案,我相信唯一需要改变的就是将文件名包含在copy

FOR /R "%ProgramFiles%" %%a IN (.) DO (
  IF EXIST "%%~a\javac.exe" (
    COPY "%%~a\javac.exe" "C:\kysumicomp"
    GOTO END
  )
)
:END
于 2012-07-03T10:42:03.587 回答
1

嗯......你真正的问题(尽管问题的标题)似乎是:

我想要实现的是一个批处理文件,它将找到 javac.exe 文件,然后将其复制到 C:\kysumicomp ...

我认为你把事情复杂化了。

试试这个(有关该选项FOR /?的更多信息,请参阅):/R

FOR /R "%ProgramFiles%" %%a IN (.) DO (
    IF EXIST "%%~a\javac.exe" COPY /Y "%%~a" C:\kysumicomp\
)

请注意,这会将所有出现的复制javac.exe到您的目录中,其中一个会覆盖另一个(您的原始解决方案也存在问题)。如果要在第一次命中后停止,则需要提前退出循环:

FOR /R "%ProgramFiles%" %%a IN (.) DO (
    IF EXIST "%%~a\javac.exe" (
       COPY "%%~a" C:\kysumicomp\
       GOTO END
    )
)
:END

最后,一个更简单的解决方案可能是复制javac.exePATH的 .

FOR %%a IN (javac.exe) DO (
    IF EXISTS "%%~$PATH:a" (
       COPY "%%~$PATH:a" C:\kysumicomp\
    )
)

然后,由于您的问题标题已经与您想要实现的目标不符,我想知道您是否真的需要做一些完全不同的事情。你为什么首先复制javac.exe到你的目录?

于 2012-07-03T06:22:43.193 回答
0

这应该做你需要的

@echo off
md "C:\kysumicomp"
for /r "C:\Program Files" %%a in (*.*) do (
if %%~nxa==javac.exe (
rem Found it!
xcopy /h /y "%%a" "C:\kysumicomp"
exit >nul
)
)
rem Done
exit >nul
于 2012-07-03T10:14:01.773 回答