Làm thế nào để tôi chuyển sang lệnh cho Viking?


11

Làm thế nào để tôi dẫn đến lệnh cho. Vì vậy, thay vì

    C:\asd>ipconfig | findstr "Address" >a

   C:\asd>for /f "tokens=15" %f in (a) do @echo %f
   192.168.1.3

Tôi muốn có thể làm điều đó trên một dòng.

C:\asd>ipconfig | findstr "Address" | for /f "tokens=15" %f do @echo %f
do was unexpected at this time.

Câu trả lời:


22

Mặc dù nó dường như không được ghi lại, bạn có thể chuyển sang lệnh bên trong lệnh FOR. Lần đầu tiên tôi biết về nó từ ví dụ này :

SC query | FOR /F "tokens=2" %%i IN ('FIND /I "SERVICE_NAME"') DO @ECHO %%i

Phiên bản sửa đổi của mã của bạn hoạt động:

C:\>ipconfig | for /f "tokens=14" %f in ('findstr "Address"') do @echo %f
192.168.x.x
192.168.y.y

Bạn cũng có thể sử dụng "thêm" bên trong lệnh FOR, như được mô tả trong câu trả lời này , để phân tích cú pháp đầu vào được lấy từ một lệnh tùy ý:

C:\>ipconfig | findstr "Address" | for /f "tokens=14" %f in ('more') do @echo %f
192.168.x.x
192.168.y.y

10

Nhìn vào tài liệu cho for(chạy for /?để xem nó), tôi không nghĩ for /fsẽ đọc từ một đường ống. Các nguồn hợp lệ duy nhất là tập tin tập tin, "chuỗi" và 'lệnh'.

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

Bạn có thể đặt lệnh bên trong fornhư thế này:

for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f

192.168.x.x
192.168.y.y

(nhờ phân tích thần kinh để chỉ ra nó phải ^|và không chỉ |)

Hoặc bạn có thể thử đặt ipconfig | findstr "Address"một tập lệnh bó riêng và gọi:

for /f "tokens=14" %f in ('ipaddresses') do @echo %f

(giả sử bạn đã gọi kịch bản ipaddresses).

Hoặc bạn có thể sử dụng forđể làm công việc findstrquá, như thế này:

for /f "tokens=2,14" %i in ('ipconfig') do @if %i==Address. @echo %j

192.168.x.x
192.168.y.y

nó không hoàn toàn giống nhau bởi vì nó sẽ không khớp với các địa chỉ IPv6, nhưng một cái gì đó dọc theo các dòng đó có thể hoạt động.

Cũng lưu ý rằng tôi đã thay đổi tokens=15thành tokens=14. Tôi nghĩ rằng trường cuối cùng trên dòng là mã thông báo 14. Dù sao cũng hoạt động với tôi.


Nếu bạn nhìn vào câu hỏi của tôi, bạn sẽ thấy tôi biết về việc sử dụng tệp tạm thời, đó là ví dụ của tôi, tôi chỉ gọi tệp 'a'. Với những gì bạn nói lúc đầu, bạn có một điểm, gần nhất để thực hiện đường ống .. là đưa lệnh vào "trong". Và tôi cho rằng vì người ta có thể làm điều đó, điều đó có thể giải thích tại sao người ta không thể sử dụng một đường ống để làm. Có vẻ như người ta không thể sử dụng một đường ống đến nó. Thật thú vị khi bạn đề cập đến thuật ngữ đường ống .. Tôi đã không nghe thấy đường ống được gọi là .. nhưng một google cho thấy nó.
barlop

4
Đối với hồ sơ, lý do nó "dường như không hỗ trợ các đường ống" chỉ đơn giản là vì bạn đã không thoát khỏi nó, đó là đường ống forthay vì ipconfig. Chỉ cần làm for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f, khi nào ^là nhân vật thoát.
Matthieu Cartier

Cảm ơn phân giải thần kinh, sẽ cập nhật câu trả lời của tôi để bao gồm điều đó.
Mikel

Vâng, tôi có nghĩa là đường ống cho, như trước đó. Nhưng tôi tin rằng một người không thể. Nhưng có thể trong "trong" như trong đề xuất của Mikel. Nhưng khi thử dòng của Mikel, tôi đã gặp phải vấn đề với dòng của Mikel .. và bạn (phân giải thần kinh) đã khắc phục điều đó bằng cách thoát khỏi đường ống.
barlop

@barlop, vâng, tôi sẽ xóa đề xuất tempfile. "pipe" là một thuật ngữ UNIX có nghĩa là một chuỗi các lệnh với các đường ống ở giữa.
Mikel
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.