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 が更新されてもバッチは引き続き機能します。

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

クリスチャンの解決策も良いものです。変更する唯一のことは、ファイル名をに含めることだと思います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.exeことPATHです。

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 に答える