Bắt đầu chương trình, đợi cho đến khi nó xuất ra chuỗi nhất định, sau đó tiếp tục


3

Tôi muốn tập lệnh bó của tôi chạy tập lệnh bó, không kết thúc, sau đó chạy thêm một số tập lệnh bó, kết thúc và sau đó đóng tập lệnh bó đầu tiên.

Vấn đề là, tập lệnh bó đầu tiên tôi bắt đầu cần thiết lập kết nối trước khi tôi có thể bắt đầu chạy các tập lệnh khác và để xác định khi nào xong, tôi cần xem đầu ra của tập lệnh đầu tiên tôi bắt đầu cho chuỗi kết nối đó là thành lập.

Trong mã giả,

start first script
wait for first script to output specific string
while the first script remains running:
    run several other scripts
close the first script

Chuỗi này sẽ chỉ xuất hiện sau khi một số dòng trước đó đã được in. Cả số lượng dòng và thời gian này có thể khác nhau. Các chuỗi không được xuất ra cùng một lúc. Tôi không thể sửa đổi tập lệnh này.

Kết quả mong muốn là thế này:

C:\>first_batch_script.bat
Some line
Doing a thing
Winning the points
The Sims did this joke better
Connection established
certain string
C:\>other_batch_script.bat
other_batch_script is done!
C:\>another_batch_script.bat
another_batch_script is done!
C:\>REM kill first_batch_script.bat

Đây là mã tôi đang thử:

FOR /f "tokens=* delims=" %%L IN ('first_batch_script.bat ^| find "certain string"') DO echo %%L
call other_batch_script.bat
call another_base_script.bat
REM kill first_batch_script.bat

Sử dụng FOR /fcó vẻ hứa hẹn, nhưng khi tôi chạy này, tập lệnh bó chạy khá chậm và sau đó dường như bị treo. Trong mọi trường hợp, ngay cả khi nó chạy qua, tôi không thấy một cách hay để thoát ra khỏi vòng lặp và tiếp tục thực thi mã của mình

Sử dụng START /WAITkhông giúp ích vì tập lệnh đầu tiên tôi bắt đầu không (và không nên) chấm dứt. Sử dụng bất kỳ loại phương pháp thời gian nào sẽ không hoạt động vì có thể mất nhiều thời gian khác nhau để kết nối được thiết lập.

Vì vậy, dài và ngắn:

Làm cách nào để theo dõi đầu ra của tập lệnh bó và chỉ thực thi các tập lệnh bổ sung sau khi đã thấy một chuỗi nhất định?


Bạn có thể chia sẻ với chúng tôi kịch bản bạn có cho đến nay? Và chính xác câu hỏi của bạn là gì?
CharlieRB

Có một lý do nhất định nó phải là một tập lệnh bó? Nếu không, bạn có thể xem liệu bạn có thể đạt được mục tiêu hay không bằng cách sử dụng ngôn ngữ / chương trình kỹ lưỡng có tên là AutoIt. Bạn thậm chí có thể kết hợp lô và AutoIt nếu cần.
Ivan Viktorovic

@IvanViktorovic Hãy thoải mái đưa ra câu trả lời bằng cách đó, nhưng tôi rất thích đây chỉ là một đoạn mã đơn giản, nhanh chóng mà tôi cần, không phải phụ thuộc thêm mà tôi cần để giới thiệu về điều này. Nhưng nếu đó là cách tốt nhất, thì đó là cách tốt nhất.
KRyan

@CharlieRB Xin lỗi về điều đó, đã sửa.
KRyan

Câu trả lời:


1

Nếu tôi hiểu đúng yêu cầu của bạn, thì nó for /fsẽ không hoạt động vì nó chờ cho đến khi quá trình bên trong kết thúc. Bạn có thể thử đồng bộ hóa trên tệp, như trong ví dụ này:
(đây sẽ là tệp tập lệnh phụ thuộc của bạn, nói wait.bat):

@echo off

:loop
timeout /t 1
(type res.txt |find "trip")  > nul 2>&1
if errorlevel 1 goto loop
echo I can go!

khởi động nó trong cửa sổ cmd, sau đó mở cmd thứ hai (cùng dir) và chạy (một lần nữa, làm ví dụ):
ping localhost |find "trip" >res.txt
Bạn sẽ thấy 'Tôi có thể đi' chỉ sau khi ping xuất ra 'chuyến đi' (vâng, nó thoát ra ngay sau đó, nhưng tập lệnh chính của bạn / quá trình không cần)

Cũng xin lưu ý rằng thông thường bạn sẽ bắt đầu kịch bản chính của mình trước! Điều này cũng đảm bảo rằng tệp synchro bị xóa.

Bạn chưa nói chính xác những gì bạn cần chờ đợi - có thể có một cách đơn giản hơn để kiểm tra điều đó? (ví dụ: sử dụng netstat để kiểm tra các kết nối mở)?


Tôi đã không nói chính xác những gì tôi đang chờ đợi chính xác bởi vì tôi không quan tâm đến câu trả lời cố gắng khám phá những lựa chọn thay thế đó. Bằng mọi giá, cảm ơn bạn đã xác nhận lại nỗi sợ của tôi : FOR /f; Tôi đã hy vọng ai đó sẽ biết một cách giải quyết cho điều đó. Dù sao, câu trả lời này không giúp tôi vì tôi không thể sửa đổi tập lệnh tôi đang chạy (những chỉnh sửa như vậy sẽ bị xóa khi tập lệnh được cập nhật và tôi không được phép thay đổi như vậy), nhưng tôi đánh giá cao thông tin , nên +1.
KRyan

bạn không cần phải sửa đổi nó. Đặt lệnh chính (ping trong ví dụ của tôi) trong một tệp bó, đặt các tập lệnh phụ thuộc của bạn vào lô thứ hai bên dưới vòng lặp (nơi tôi đặt 'Tôi có thể đi') và tạo lô thứ ba sẽ bắt đầu hai tập lệnh khác (bắt đầu)
wmz

xin lỗi thậm chí còn dễ dàng hơn: Đặt lệnh chính (ping trong ví dụ của tôi) trong một tệp bó, đặt start myMaster.batlên trên cùng wait.bat, đặt các tập lệnh phụ thuộc của bạn bên dưới vòng lặp (nơi tôi đặt 'Tôi có thể đi')
wmz

Ah, tôi nghĩ rằng tôi thấy. Tôi không thể kiểm tra nó ngay tại thời điểm này, nhưng tôi tin rằng nó sẽ hoạt động. Tôi sẽ chấp nhận một khi tôi đã xác nhận điều đó.
KRyan

Cảm ơn bạn, nó hoạt động hoàn hảo. Đưa cho tôi một cái để tìm ra ý bạn muốn đặt ở đâu, nhưng nó hoạt động.
KRyan

0

Có vẻ như bạn đang sử dụng sai phương pháp. Có những toán tử mà bạn có thể sử dụng để chuyển đầu ra sang một thứ gì đó, nhưng cũng có thể đưa một cái gì đó vào một chương trình.

Phương pháp thứ hai sẽ cho phép bạn điều khiển một chương trình dòng lệnh như FTP.exe và theo những gì bạn đang viết, có vẻ như đây chính xác là những gì bạn cần.

Tạo một tệp văn bản có tất cả các phím bấm bạn cần tự làm, nhấn một phím nhập khi cần nhập, vì vậy mỗi lệnh xuất hiện trên dòng riêng của nó.

Ví dụ input.txt:

MyUsername
qwertyPasswd
y
2
3
quit

Ở trên đầu tiên sẽ nhập MyUsernamevà nhấn enter. Sau đó, nó sẽ viết dòng thứ hai, vv

Bây giờ, bắt đầu chương trình của bạn và dẫn textfile vào nó:

C:\>ftp.exe <input.txt

.

Bảng phân tích các lệnh:

C:\>ftp.exe đây là một ví dụ về chương trình bạn có thể đang chạy.

<input.txt lưu ý <ký tự, cái này nhập nội dung của input.txt và coi nó là userinput.

Lưu ý rằng nếu chương trình không mong đợi đầu vào bàn phím, đường ống sẽ chờ cung cấp nó.


Không, đây không phải là điều tôi cần. Các lệnh mà tôi phát hành không phải là các lệnh trong chương trình đầu tiên, mà là các tập lệnh bó riêng biệt. Họ chỉ sử dụng kết nối được thiết lập bởi chương trình đầu tiên.
KRyan

Bạn cũng có thể sử dụng đầu ra của một tập lệnh làm đầu vào cho tập lệnh khác. Có lẽ nó vẫn hoạt động. Để làm điều này, sử dụng | tính cách. Chương trình1 | Chương trình 2 nơi đầu ra của chương trình1 sẽ được truyền đến đầu ra của chương trình2. (hoặc tập lệnh trong trường hợp này)
LPChip

Tôi không đủ quen thuộc với kịch bản Windows, nhưng nó sẽ hoạt động tốt như thế nào khi tập lệnh đầu tiên xuất ra nhiều dòng ở các trường hợp riêng biệt. Nếu tập lệnh được chạy ngay khi nhận được bất kỳ đầu vào nào , nó sẽ không nhận được chuỗi. Nếu nó chờ kịch bản đầu tiên chấm dứt, điều đó sẽ không xảy ra vì nó không (và không nên) chấm dứt.
KRyan

Tôi không thể trả lời rằng vì tôi có kiến ​​thức không chuyên sâu về kịch bản của bạn. Bạn nên thử nó và xem những gì sẽ xảy ra.
LPChip
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.