2012-07-03 1 views
0

Я новичок в CMD, возникли проблемы с этим:как использовать для/ф команды, если файл имеет место

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

То, что я пытаюсь достичь является пакетный файл, который будет найти файл javac.exe затем скопируйте его в C: \ kysumicomp, но я не хочу, чтобы это был абсолютный путь, поэтому, если моя версия java будет работать, пакет все равно будет работать.

+2

Почему этот вопрос отмечен java? –

+1

@TedHopp Я подозреваю, что в скрипте есть файл с именем 'javac.exe'! : P –

ответ

1

Хм ... ваш реальный вопрос (несмотря на название вопроса), кажется:

What I am trying to achieve is a batch file that that will find the javac.exe file then copy it to 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.exe, что находится в вашем PATH, при условии, что это.

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

Тогда, так как вы вопрос название уже не соответствует тому, что вы пытаетесь достичь, мне интересно, если вам действительно нужно сделать что-то совершенно другое вообще. Почему вы копируете javac.exe в свой каталог в первую очередь?

+0

Я все равно получаю ту же ошибку: C: \> copy "C: \ Program" "C: \ kysumicomp" Система не может найти указанный файл. – Kysumi

+0

Какую версию вы пробовали? –

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 
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 

решение Кристиана также хороший, я считаю, что единственное, что нужно изменить, чтобы включить имя файла в copy:

FOR /R "%ProgramFiles%" %%a IN (.) DO (
    IF EXIST "%%~a\javac.exe" (
    COPY "%%~a\javac.exe" "C:\kysumicomp" 
    GOTO END 
) 
) 
:END 
Смежные вопросы