Sử dụng Batch findstr cho các tệp có khoảng trắng


2

Tôi đang cố gắng tìm kiếm một chuỗi trong một tập tin nhất định. Tệp này có thể có các khoảng trắng trong tên của nó và tôi gặp sự cố với tệp Batch.

Tôi có thể dễ dàng làm điều này bằng cách điều khiển nhận được kết quả chính xác:

findstr /m /C:tofind "C:/myPath/my file name with white spaces"

Nhưng khi tôi cố gắng thực hiện nó trên tệp Batch, nó không hiển thị cho tôi bất kỳ kết quả nào cả:

@echo off
for /r  "delims:|" %%i in (*) do  (
    findstr /m /C:tofind "%%i"
)

Tôi đang làm gì sai?


Các tập tin bash bạn nói là một lỗi đánh máy, tôi giả sử. Chính xác mục đích của vòng lặp for là gì? Lệnh for /rkhông có các tùy chọn như for /f, theo đó cú pháp sẽ delims=thay thế delims:.
Marcks Thomas

@MarcksThomas Tôi chỉ muốn lặp lại các yếu tố của thư mục. Đừng biết cách khác để làm điều đó.
Alvaro


Và vâng, đó là một lỗi đánh máy. Tôi muốn nói hàng loạt.
Alvaro

Câu trả lời:


3

Tất cả bạn cần là như sau:

findstr /m /c:toFind *

Nó sẽ tìm kiếm mọi tệp trong thư mục hiện tại của bạn và in ra tên của các tệp chứa chuỗi tìm kiếm của bạn.

Nếu bạn muốn tìm kiếm một thư mục khác với thư mục hiện tại, thì:

pushd "c:\yourPath"
findstr /m /c:toFind *
popd

Nếu bạn muốn bao gồm đường dẫn đầy đủ của mỗi tệp trong đầu ra, thì:

findstr /m /c:toFind "c:\yourPath\*"

Cách thích hợp để sử dụng vòng lặp FOR để lặp lại các tệp như bạn dự định ban đầu là:

for %%F in (*) do findstr /m /c:toFind "%%F"

Nhưng không cần sử dụng FOR để lặp lại các tệp khi FINDSTR có thể tự lặp lại các tệp.

Lệnh FOR là lệnh phức tạp nhất có sẵn cho lô. Có nhiều hình thức khác nhau làm những việc hoàn toàn khác nhau. Đây chỉ là một vài:

for %%A in (file list with wildcard support)     -  iterate files
for /f "options" %%A in (filePath)               -  read and parse a file
for /f "options" %%A in ("string")               -  parse a string
for /f "options" %%A in ('someCommand')          -  parse the output of a command

Bạn nên đọc tài liệu rất cẩn thận. Nhập HELP FORhoặc FOR /?từ dấu nhắc lệnh để lấy tài liệu.


Cảm ơn bạn đời !! Lựa chọn thứ hai của bạn làm việc như một cơ duyên! Kết quả đã sẵn sàng để sử dụng cho PHP. Chỉ là một câu hỏi nhanh. Có thể trả lại cho họ một mảng như vậy bằng cách nào đó? Tôi nhận được chúng giống như một chuỗi chỉ cách nhau bởi khoảng trắng. (trên cuộc gọi PHP đến tệp .bat)
Alvaro

@Alvaro - Tôi không hiểu bạn đang hỏi gì. Có vẻ như đó là một câu hỏi mới, có lẽ trên StackOverflow, với nhiều chi tiết hơn.
dbenham

ok, dù sao cũng cảm ơn Ngoài ra, đây có phải là cách nhanh hơn để tìm kiếm một văn bản thông qua các mục?
Alvaro

@Alvaro - Tôi chưa bao giờ thử nghiệm, nhưng tôi nghi ngờ có sự khác biệt đáng kể về tốc độ trong trường hợp này.
dbenham

1

Tôi tìm thấy giải pháp.

Nó dường như hoạt động với dấu ngoặc kép trên inmệnh đề và /Fthay vì /R/ for thefor`:

@echo off
for /f  %%i in ("*") do  (
    findstr /m /C:toFind "%%i"
)

Vòng lặp FOR / F của bạn không làm bất cứ điều gì mang tính xây dựng - nó chỉ đơn giản gán *cho biến FOR %%i. Một lớp lót sau đây cho kết quả chính xác như trên:findstr /m /c:toFind *
dbenham

Ý anh là gì? Nó dường như để giải quyết vấn đề của tôi với khoảng trắng. Bây giờ trong %%i tôi có tên đầy đủ của tập tin chứ không chỉ là một phần như tôi đã có trước đây.
Alvaro

1
Tôi không nói rằng mã của bạn không hoạt động, tôi chỉ nói rằng nó phức tạp không cần thiết và nó không giải quyết được vấn đề như bạn nghĩ. Xem câu trả lời của tôi
dbenham
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.