「Where」コマンドの成功コードの構文


0

「Where」コマンドの実行時に成功コードを取得する構文は何ですか?ループを終了するためにそれが必要です。

そして、見つかったファイルのディレクトリを取得する構文は何ですか?

このコマンド:

WHERE / r "C:\ Dir \ Dir2 FindMe.txt"

コマンドウィンドウにファイルを正しく表示します。

C:\ Dir1 \ Dir2 \ Dir3 \ FindMe.txt

しかし今、私は何をしますか?親切にしてください、私は初心者未満です。

編集:私の質問はhttps://stackoverflow.com/questions/7562506に似ていますが、私の場合、探しているファイルは直接パスではなく、上、上、下です。例を挙げて、同じディレクトリから開始すると、私のファイルはC:\ Temp \ Dir1 \ Dir2 \ Dir3 ** \ Dir14 \ Dir15 ** \ FindMe.txtにあります。つまり、Dir3に移動して、WHEREコマンドでファイルを見つけ、ループを停止する必要があります。

編集2:私はできる限りすべてを剥ぎ取った。txtファイル「FindMe.txt」をどこかに作成し、このコードを.cmdとして別の場所に切り取ってから、別の.txtファイルを.cmdファイルにドラッグします。運が良ければ、FindMe.txtのディレクトリを回答として停止する必要があります。私が助けが必要なのは擬似コードです:

@ECHO OFF

SET "cmdPath=%~dp0"
SET "cmdPath=%cmdPath:~0,-1%"  ::without back slash
SET "searchPath=%cmdPath%"     ::start search here

:loop
  IF EXIST "%searchPath%\FindMe.txt" (
    set "txtPath=%searchPath%
    ECHO txtPath%searchPath%\FindMe.txt
    GOTO :EOF
  )
  IF "%searchPath:~1%" == ":" (
    ECHO FindMe.txt not found.
    pause
    GOTO :EOF
  )
  echo searchPath=%searchPath%
rem run: WHERE /r "%searchPath%" /q FindMe.txt
rem if successful (found) (
rem run: WHERE /r "%searchPath%" FindMe.txt 
rem just keep the path and rename to txtPath
rem goto :eof
  CALL :getPath "%searchPath%"
  GOTO loop
:end

:getPath
SET "searchPath=%~dp1"
SET "searchPath=%searchPath:~0,-1%"
:end
:eof

1
スーパーユーザーへようこそ。あなたの質問は曖昧すぎます。「成功コード」とはどういう意味ですか?あなたがやろうとしていることを私たちと分かち合っていただければ助かります。また、質問に問題を与えているバッチコードの部分を追加すると、コンテキスト全体を確認できます。質問の下に編集リンクがあります
チャーリーRB

@CharlieRB私の編集を参照してください
JuergenL

回答:


1

whereコマンドが成功したかどうかを確認するには、実行後に%errorlevel%を調べます。

c:\tmp>where x
c:\tmp\x
c:\tmp>echo %errorlevel%
0
c:\tmp>where y
INFO: Could not find files for the given pattern(s).
c:\tmp>echo %errorlevel%
1

また、findコマンドの出力を保存するには、次を使用できます(ただし、複数の方法があります)。

c:\tmp>for /f %i in ('where cmd.exe') do @set ans=%i

c:\tmp>echo %ans%
C:\Windows\System32\cmd.exe

(たとえば、出力を一時ファイルにパイプしてから、一時ファイルを読み取ることもできます。)

これをバッチファイルに入れる場合は、forコマンドで行の%記号を2倍にする必要があることに注意してください。

また、サブルーチンでこれを複数回行う場合、ファイルが見つからない場合は「ans」が設定されないことに注意してください(forループに反復がないため-これが意味をなさない場合)無視してください)、ansを使用する前にerrorlevelを確認する必要があります。

また、forループの後にerrorlevelをチェックしても、whereコマンド自体については何も通知されないことに注意してください。

path = `where x`のようなことだけができない理由を聞かないでください、わからないから。そして、バッチスクリプトは常に頭痛の種になります。ちなみに、スクリプトを作成する場合は、はるかに強力なスクリプト言語を使用できます。

エラーレベルをまったく使用しない方法を次に示します。次のコードをバッチファイルに入れ、whereコマンドを探しているファイルに変更します。ただし、「2> nul」部分はそのままにしておくか、ファイルが見つかるまでファイルが見つからなかったというエラーメッセージを吐き出し続けます。

@echo off

REM set location to an empty string
set location=

REM set the command to run in a loop
set command="where testfile 2> nul"

REM simulating a while loop
:while1
REM running the command defined above and storing the result in the "location" variable.
REM Note: result will only be stored if a file was actually found. If not, the "set location" part is not executed.
for /f %%i in ('%command%') do @set location=%%i
if "%location%" == "" (
    REM location is STILL an empty string like we set in the beginning; no file found
    REM let's sleep for a second to not overload the system
    timeout /t 1 > nul
    REM ... and go back the :while tag
    goto :while1
)

REM If we got to this point, a file was found, because location wasn't an empty string any more.

echo location: %location%

ありがとう、しかしこれは私が消化しなければならない。私が理解した成功コードは、私は思うが、まだ試していない。WHEREを2回実行する準備ができました。1回はループを停止し、もう1回はディレクトリを取得します。成功コードに似たものを使用できますか?
JuergenL

このようなものはどうですか?ファイルが見つかった後、whereコマンドを2回実行しなければならない方法を見つけました。割り当てられた値以外は、エラーレベルをテストしないでください。なぜ私はそれを前に考えなかったのか分からない。更新された回答をご覧ください。
SadBunny

私はあなたの(最初の)提案を試みましたが、機能させることができませんでした。私の最後の編集を見てください。多分それは私の問題をよりよく説明しています。-一緒にいてくれてありがとう。私はこれに数日かけて数え切れないほどの時間を費やしましたが、どこにも行きませんでした。
JuergenL

予想よりも時間がかかりました。今すぐ更新された回答をご覧ください。
SadBunny
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.