2008-11-04 25 views
5

Tôi có một tập tin thực thi (trong Windows XP, với phần mở rộng lệnh kích hoạt)/f với dòng sau:hàng loạt đóng cửa sớm trên cho lệnh

for /f %%s in ('type version.txt') do set VERSION=%%s 

Trên một số máy tính, nó chỉ hoạt động tốt (như minh họa bởi this SO question), nhưng trên khác nó giết chết cmd (cửa sổ bảng điều khiển chỉ đóng lại)

Tại sao?


Lưu ý: các máy tính dường như có một cấu hình tương tự: XPSP2, người dùng có quyền quản trị, không có 'vi xử lý Command" quy định tại HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor ...

+0

Cảm ơn bạn đã chỉnh sửa, Oli: Tôi muốn gắn thẻ câu hỏi đó 'script', nhưng tự động hoàn thành trên thẻ SO đã lừa tôi;) – VonC

Trả lời

4

tôi một câu trả lời đầu tiên theo kinh nghiệm:.

for /f %%s in (version.txt) do ... 

công trình tốt, trên mỗi máy tính

dường for /f làm việc với một tên tập tin, không phải với bất kỳ d os lệnh như 'loại tên tập tin'.

Tuy nhiên, điều đó không đúng cho tất cả các máy tính khách hàng của tôi (trên một số, các 'loại filename' hoạt động tốt)

Nếu bạn muốn 15 điểm (dễ dàng?) ;-), bạn có thể để lại một câu trả lời cho câu hỏi:
tại sao 'for/f' đôi khi không hoạt động với bất kỳ thứ gì khác ngoài tên tệp. Và tại sao nó chỉ đóng phiên DOS?


Edit: (!) 3 năm sau, barlop phải đối mặt với một tình huống tương tự, chi tiết trong câu hỏi "for /f closes cmd prompt immediately?". Kết luận của ông là:

COMSPEC đã được liệt kê khi làm SET + ENTER.
Vì vậy, tôi đã mở cửa sổ biến môi trường và thấy COMSPEC không được liệt kê dưới biến người dùng hoặc biến hệ thống. Tôi đã thêm nó vào System Variables, bắt đầu một dấu nhắc lệnh, và nó có vẻ hoạt động tốt.

thread on ss64 forum này được đề cập trong câu trả lời cho câu hỏi của chủ nhà, chứa các chi tiết.

Các pháo kích ra trong "for" loop để hoàn thành 'dir' (hoặc bất kỳ lệnh mà bạn đã yêu cầu điền vào) yêu cầu ComSpec được thiết lập để tải lại cmd cửa sổ.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\ComSpec= 
%SystemRoot%\system32\cmd.exe 
+0

Có thể cung cấp 15 điểm không cắt mù tạt? :-) Thành thật mà nói, tôi không thể tái tạo hành vi mà bạn đã đề cập. Bạn có thể đăng thêm một số chi tiết không? – Tomalak

+0

Cảm ơn bạn, Tomalak, vì đã dành thời gian để kiểm tra vấn đề đó. Vấn đề là, tôi không có nhiều chi tiết bên cạnh một trong những ấu trùng đề cập đến: trên một máy tính của khách hàng, trên một phiên DOS, tôi gõ một "cho/f% s trong ('loại afilename.txt') làm echo% s" và. .. "poof" không có cửa sổ DOS nữa ... – VonC

+0

Tôi sẽ theo đuổi điều này, nhưng tôi muốn kiểm tra với cộng đồng SO nếu vấn đề đó đã được nhìn thấy trước đây. Rõ ràng là không. Tôi sẽ đăng bất kỳ kết luận nào tôi có thể tìm thấy. – VonC

0

Là nó mà các tập tin không có phần mở rộng và do đó xử lý cmd nó giống như một thư mục đó không tồn tại?

+0

Thực ra, tệp tồn tại và có phần mở rộng (tên tệp chỉ là tên foobar): "for/f% s in ('type afilename.txt') do echo% s "kích hoạt đóng cửa ngay lập tức của các cửa sổ DOS – VonC

0

Nếu tiện ích mở rộng lệnh bị tắt, tham số (bộ) cho lệnh for phải là tệp.

Nếu mở rộng lệnh được bật, tham số (bộ) cho lệnh cho có thể là tệp, chuỗi hoặc lệnh.

Tiện ích mở rộng lệnh bị vô hiệu hóa trên máy tính của khách hàng nơi tập hợp 'loại tên tệp' không thành công.

Để biết thông tin về bật hoặc tắt tiện ích mở rộng lệnh, hãy nhập "cmd /?"

+0

Ông đã đề cập đến các phần mở rộng lệnh được kích hoạt (nhất quán, tôi đoán). – Tomalak

+0

Có, nhưng từ nhận xét của Craig, tôi sẽ kiểm tra lại điều đó. Để chắc chắn, Craig, bạn có thể chính xác các tiêu chí xác thực phần mở rộng lệnh thực tế là hoặc không được kích hoạt? – VonC

+0

Darned ... Tôi vừa kiểm tra và kiểm tra lại sổ đăng ký, tiện ích mở rộng lệnh thực sự được bật và không có giá trị đặc biệt nào khác nổi bật. Các sự kiện cửa sổ không hiển thị bất cứ điều gì ra khỏi bình thường. cmd/E: ON vẫn đóng chính nó trên một for/f trong ('command') dòng lệnh ... bực bội;) – VonC

0

Chờ ... có thể là bạn có dấu nháy đơn xung quanh tên tệp không? MS đang nói rằng filenamesets nhận được dấu nháy kép và chuỗi ký tự có dấu nháy đơn.

for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions] 

for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions] 

for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions] 

Trừ khi bạn đang thực hiện điều này.

Bạn có thể sử dụng cho/F phân tích Logic trên một chuỗi ngay lập tức, bằng cách gói các filenameset giữa ngoặc trong dấu ngoặc đơn ngoặc kép (có nghĩa là, 'filenameset'). Filenameset được coi là một dòng đầu vào từ một tệp và sau đó được phân tích cú pháp.

+0

Cảm ơn bạn Keng cho đề xuất của bạn. Tôi sẽ kiểm tra điều đó vào ngày mai tại nơi làm việc. – VonC

+0

Argh ... nope: biểu mẫu cuối cùng ('command') sẽ đóng ngay lập tức cửa sổ DOS – VonC

1

Về các phần mở rộng lệnh, có khả năng CMD.EXE được gọi với/E: OFF để mở rộng lệnh bị vô hiệu hóa (mặc dù kích hoạt trong registry).

Nếu sử dụng tùy chọn trình bao tiện ích mở rộng lệnh trong tập lệnh, bạn nên thực hiện thủ thuật sau khi bắt đầu tập lệnh.

- Thông tin dán từ http://www.ss64.com/nt/setlocal.html

setlocal sẽ thiết lập một ERRORLEVEL nếu có một cuộc tranh cãi. Nó sẽ bằng không nếu một trong hai đối số hợp lệ được đưa ra và một đối số khác.

Bạn có thể sử dụng điều này trong một tập tin thực thi để xác định xem phần mở rộng lệnh có sẵn, sử dụng kỹ thuật sau:

VERIFY errors 2>nul 
SETLOCAL ENABLEEXTENSIONS 
IF ERRORLEVEL 1 echo Unable to enable extensions 

này hoạt động vì "XÁC MINH lỗi" đặt ERRORLEVEL đến 1 và sau đó SETLOCAL sẽ không đặt lại giá trị ERRORLEVEL nếu các phần mở rộng không có sẵn (ví dụ: nếu tập lệnh đang chạy theo command.com)

Nếu mở rộng Command bị vô hiệu hóa vĩnh viễn thì SETLOCAL ENABLEEXTENSIONS sẽ không khôi phục chúng.

+0

Cảm ơn bạn đã trả lời chi tiết này ... vẫn không có may mắn. Cửa sổ DOS đó vẫn đóng, mặc dù ENABLEEXTENSIONS được kích hoạt thành công ... – VonC

Các vấn đề liên quan