Chuyển hướng đầu ra từ trong tệp Batch


110

Tôi đang tạo một tệp hàng loạt với một số lệnh đơn giản để thu thập thông tin từ hệ thống. Tệp lô chứa các lệnh để lấy thời gian, thông tin IP, người dùng, v.v.

Tôi đã tập hợp tất cả các lệnh trong một tệp lô và nó chạy, nhưng tôi muốn tệp lô, khi chạy sẽ xuất kết quả ra tệp văn bản (nhật ký). Có lệnh nào mà tôi có thể thêm vào lô sẽ làm như vậy không?

Hãy nhớ rằng tôi không muốn chạy hàng loạt từ cmd, sau đó chuyển hướng đầu ra; Tôi muốn chuyển hướng đầu ra từ bên trong lô, nếu điều đó có thể.

Câu trả lời:


161

Cách đơn giản đơn giản là chậm vì nó mở và định vị con trỏ tệp đến End-Of-File nhiều lần.

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt

Một cách tốt hơn - dễ viết hơn và nhanh hơn vì tệp chỉ được mở và định vị một lần.

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)

Một cách tốt và nhanh chóng khác chỉ mở và định vị tệp một lần

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN

Chỉnh sửa 2020-04-17

Thỉnh thoảng bạn có thể muốn ghi liên tục vào hai hoặc nhiều tệp. Bạn cũng có thể muốn các thông báo khác nhau trên màn hình. Bạn vẫn có thể thực hiện điều này một cách hiệu quả bằng cách chuyển hướng đến các chốt điều khiển không xác định bên ngoài khối hoặc chương trình con có dấu ngoặc đơn, sau đó sử dụng &ký hiệu để tham chiếu đến các tệp đã được mở.

call :sub 9>File1.txt 8>File2.txt
exit /b

:sub
echo Screen message 1
>&9 File 1 message 1
>&8 File 2 message 1
echo Screen message 2
>&9 File 1 message 2
>&8 File 2 message 2
exit /b

Tôi đã chọn sử dụng các tay cầm 9 và 8 theo thứ tự ngược lại vì cách đó có nhiều khả năng tránh chuyển hướng vĩnh viễn tiềm ẩn do lỗi thiết kế triển khai chuyển hướng của Microsoft khi thực hiện nhiều chuyển hướng trên cùng một lệnh. Rất khó xảy ra, nhưng ngay cả cách tiếp cận đó cũng có thể làm lộ ra lỗi nếu bạn đủ cố gắng. Nếu bạn chuyển hướng giai đoạn hơn bạn đảm bảo tránh được sự cố.

3>File1.txt ( 4>File2.txt call :sub)
exit /b

:sub
etc.

2
Yêu thích các giải pháp mà tôi có thể đặt nó cho phần còn lại của tệp
Sam

3
Lưu ý rằng giải pháp cuộc gọi thay đổi % 0 của bạn (thành phụ trong trường hợp này), có thể có hoặc không như bạn muốn.
Jannes

1
@Jannes - Đúng, nhưng bạn luôn có thể nhận được thông tin về tập lệnh lô đang chạy nếu bạn thêm công cụ sửa đổi. Ví dụ: %~f0luôn cung cấp đường dẫn đầy đủ cho tập lệnh lô, ngay cả khi bên trong chương trình con CALLed:.
dbenham

3
@ThariqNugrohotomo ->output.txt 2>&1
dbenham

2
@Moondra - đó là cú pháp hàng loạt tiêu chuẩn để gọi một chương trình con được gắn nhãn trong cùng một tập lệnh. Thực thi cmd /?hoặc help cmdtừ dòng lệnh console để có tài liệu. Bí quyết của phương pháp thứ ba là chuyển hướng trên CALL áp dụng cho tất cả các lệnh trong chương trình con CALLed.
dbenham

66

nếu bạn muốn cả luồng ngoài và luồng sai được chuyển hướng

dir >> a.txt 2>&1

27
+1. Nó cũng đáng chỉ ra rằng việc sử dụng >>sẽ thêm vào a.txt. Để ghi đè a.txtthay thế, hãy sử dụng >. stackoverflow.com/q/4458231/1098302
Aaron

Xin chào, có cách nào để chuyển hướng đầu ra trên bảng điều khiển không?
Sandeep Singh

Đó là những gì nó làm
Kalpesh Soni

16

Tôi biết đây là một bài đăng cũ hơn, nhưng ai đó sẽ tình cờ tìm thấy nó trong một tìm kiếm của Google và có vẻ như một số câu hỏi mà OP hỏi trong các bình luận đã không được giải quyết cụ thể. Ngoài ra, hãy bình tĩnh với tôi vì đây là câu trả lời đầu tiên của tôi được đăng trên SO. :)

Để chuyển hướng đầu ra đến một tệp bằng tên tệp được tạo động, cách tiếp cận chuyển đến (đọc: nhanh & bẩn) của tôi là giải pháp thứ hai được cung cấp bởi @dbenham. Ví dụ:

@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)

Sẽ tạo một tệp giống như những gì bạn thấy trong ảnh chụp màn hình này của tệp trong thư mục đích

Điều đó sẽ chứa đầu ra này:

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log

Cũng nên nhớ rằng giải pháp này phụ thuộc vào ngôn ngữ, vì vậy hãy cẩn thận khi bạn sử dụng nó như thế nào / khi nào.


Cảm ơn điều này rất hữu ích. Câu hỏi nhanh là có lý do tại sao bạn đang sử dụng .log so với .txt? Điều đó làm cho một sự khác biệt?
Moondra

1
@Moondra không nó không. Nó chỉ là ngữ nghĩa trong trường hợp này. Điều đó không có nghĩa là không có ứng dụng yêu cầu / grep dựa trên loại tệp, vì vậy chỉ cần lưu ý nếu / cách tệp của bạn đang được sử dụng.
Anthony

9
echo some output >"your logfile"

hoặc là

(
 echo some output
 echo more output
)>"Your logfile"

nên điền vào hóa đơn.

Nếu bạn muốn APPENDđầu ra, hãy sử dụng >>thay vì >. >sẽ bắt đầu một tệp nhật ký mới.


9
@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name" 
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address" 

ipconfig | find "IPv4" 
ipconfig | find "Default Gateway"

)

@pause

Tôi nghĩ rằng đây là cách thanh lịch nhất. Cảm ơn Wesley!
Kiswanij

5

Có một chương trình nhỏ thú vị mà bạn có thể sử dụng để chuyển hướng đầu ra tới một tệp và bảng điều khiển

some_command  ^|  TEE.BAT  [ -a ]  filename 


4

Thêm hai dòng này gần đầu tệp hàng loạt của bạn, tất cả stdout và stderr sau đó sẽ được chuyển hướng đến log.txt:

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1

Điều này làm việc cho tôi, cảm ơn. Bất kỳ cân nhắc đặc biệt nào mà điều này có thể không thành công? (ví dụ: tràn kích thước đầu ra)
CCarlos

Chào, cảm ơn cho câu trả lời của bạn! có cách nào để chuyển hướng nó trên bảng điều khiển không?
Sandeep Singh

3
@echo OFF
[your command] >> [Your log file name].txt

Tôi đã sử dụng lệnh trên trong tệp lô của mình và nó hoạt động. Trong tệp nhật ký, nó hiển thị kết quả lệnh của tôi.


0

Điều này có thể không thành công trong trường hợp các ký tự "độc hại" trong đầu vào. Xem xét đầu vào như thế nàyIsAnIn ^^^^ đặt là một cách tốt để hiểu những gì đang xảy ra. Chắc chắn có một quy tắc rằng chuỗi đầu vào PHẢI nằm trong dấu ngoặc kép nhưng tôi có cảm giác rằng quy tắc này là quy tắc hợp lệ chỉ khi ý nghĩa của đầu vào là một vị trí trên phân vùng NTFS (có thể đó là quy tắc cho các URL I không chắc chắn). Nhưng nó không phải là một quy tắc cho một chuỗi đầu vào tùy ý tất nhiên (đó là "một thực hành tốt" nhưng bạn không thể đếm với nó).


0

Thêm các dòng sau vào cuối tệp hàng loạt của bạn sẽ lấy mọi thứ giống như hiển thị bên trong cửa sổ CMD và xuất thành tệp văn bản:

powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^a')
powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^c')
powershell Get-Clipboard > MyLog.txt

Về cơ bản, nó thực hiện chọn tất cả -> sao chép vào khay nhớ tạm -> dán vào tệp văn bản .

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.