ไวยากรณ์สำหรับรหัสสำเร็จของคำสั่ง“ ที่ไหน”


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
ยินดีต้อนรับสู่ Super User คำถามของคุณคลุมเครือเกินไป คุณหมายถึง "รหัสสำเร็จ" หมายความว่าอะไร? มันจะมีประโยชน์ถ้าคุณแบ่งปันกับเราในสิ่งที่คุณพยายามจะทำ นอกจากนี้หากคุณเพิ่มส่วนของรหัสชุดที่ทำให้คุณมีปัญหากับคำถามของคุณเราสามารถดูบริบททั้งหมด มีลิงค์แก้ไขอยู่ใต้คำถาม
CharlieRB

@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

(คุณสามารถไพพ์เอาต์พุตไปยังไฟล์ temp แล้วอ่านไฟล์ temp เป็นต้น)

โปรดทราบว่าหากคุณใส่สิ่งนี้ลงในไฟล์แบทช์คุณจะต้องเพิ่ม% -signs ในบรรทัดด้วยคำสั่ง for-double

โปรดทราบด้วยว่าหากคุณจะทำหลายครั้งให้พูดในรูทีนย่อย 'ans' จะไม่ได้รับการตั้งค่าหากไม่พบไฟล์ (เนื่องจาก for loop ไม่ได้มีการวนซ้ำใด ๆ - ถ้าไม่เหมาะสมกับคุณ เพียงเพิกเฉยต่อมัน) ดังนั้นคุณต้องตรวจสอบระดับข้อผิดพลาดก่อนที่จะใช้คำตอบ

นอกจากนี้โปรดทราบว่าการตรวจสอบข้อผิดพลาดระดับหลังจาก for for loop จะไม่บอกอะไรคุณเกี่ยวกับคำสั่ง where

อย่าถามว่าทำไมคุณไม่สามารถทำอะไรบางอย่างเช่นpath = `x '; เพราะฉันไม่รู้ และการเขียนสคริปต์เป็นชุดทำให้ฉันปวดหัวอยู่เสมอ ยังมีอีกหลายภาษาสคริปต์ที่มีประสิทธิภาพถ้าคุณต้องการที่จะก้าวไปข้างหน้าในการเขียนสคริปต์

นี่เป็นวิธีที่ไม่ใช้ข้อผิดพลาดระดับเลย ใส่รหัสด้านล่างใน batchfile และเปลี่ยนคำสั่ง 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 สองครั้งหนึ่งครั้งเพื่อหยุดลูปและอีกครั้งเพื่อรับไดเรกทอรี บางทีฉันสามารถใช้บางอย่างที่คล้ายกับรหัสสำเร็จหรือไม่
JuergenL

แล้วเรื่องแบบนี้ล่ะ? ฉันพบวิธีที่ต้องดำเนินการคำสั่ง where สองครั้งหลังจากที่พบไฟล์เพียงแค่ไม่ทดสอบ errorlevel เลย แต่ค่าที่กำหนด ไม่รู้ทำไมฉันไม่เคยคิดอย่างนั้นมาก่อน ดูคำตอบที่อัปเดตของฉัน
SadBunny

ฉันลองใช้ข้อเสนอแนะ (แรก) ของคุณ แต่ไม่สามารถใช้งานได้ ลองดูที่การแก้ไขครั้งล่าสุดของฉันซึ่งอาจอธิบายปัญหาของฉันได้ดี - ขอบคุณที่แขวนไว้ที่นั่นกับฉัน ฉันใช้เวลานับวันไม่ถ้วนกับสิ่งนี้ แต่ไม่ได้ไปไหน
JuergenL

ใช้เวลานานกว่าที่คาดดูคำตอบที่อัปเดตทันที
SadBunny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.