2013-04-24 35 views
38

Tôi đang cố gắng gán đầu ra của lệnh cho một biến - như trong, tôi đang cố gắng đặt phiên bản flash hiện tại thành một biến. Tôi biết điều này là sai, nhưng đây là những gì tôi đã cố gắng:Gán đầu ra của Lệnh thành Biến trong tệp Hàng loạt

set var = reg query HKLM \ SOFTWARE \ Macromedia \ flashplayer \ CurrentVersion>

hoặc

reg truy vấn hklm \ SOFTWARE \ Macromedia \ FlashPlayer \ CurrentVersion >> đặt var

Vâng, bạn có thể thấy tôi bị mất một chút. Bất kỳ và tất cả các trợ giúp được đánh giá cao!

+0

Nếu các câu trả lời dưới đây không hữu ích, hãy tìm kiếm chuyển hướng trên google. –

+0

có thể trùng lặp của [Tương đương hàng loạt các cú pháp Bash] (http://stackoverflow.com/questions/2768608/batch-equivalent-of-bash-backticks) –

+0

Thực ra bản gốc có vẻ là [Làm thế nào để tôi có được kết quả của một lệnh trong một biến trong cửa sổ?] (http://stackoverflow.com/q/108439/12892). –

Trả lời

79

Một phương pháp đã được đưa ra, tuy nhiên cách này bạn không cần một tập tin tạm thời.

for /f "delims=" %%i in ('command') do set output=%%i 

Tuy nhiên, tôi chắc chắn điều này có ngoại lệ và giới hạn riêng.

+0

Tuyệt vời, cảm ơn sự giúp đỡ! – user2283234

+2

Nếu giải quyết được câu hỏi của bạn, vui lòng đánh dấu câu hỏi đó là đã được chấp nhận. –

+2

Tôi nhận được '%% i bất ngờ tại thời điểm này.' là kết quả khi tôi thực thi lệnh trên. Không chắc chắn lý do tại sao. –

9

This post có một phương pháp để đạt được điều này

từ (zvrba) Bạn có thể làm điều đó bằng cách chuyển hướng đầu ra vào một tập tin đầu tiên. Ví dụ:

echo zz > bla.txt 
set /p VV=<bla.txt 
echo %VV% 
1

Bạn không thể gán một đầu ra quá trình trực tiếp vào một var, bạn cần phải phân tích đầu ra với một vòng lặp Ví/F:

@Echo OFF 

FOR /F "Tokens=2,*" %%A IN (
    'Reg Query "HKEY_CURRENT_USER\Software\Macromedia\FlashPlayer" /v "CurrentVersion"' 
) DO (
    REM Set "Version=%%B" 
    Echo Version: %%B 
) 

Pause&Exit 

http://ss64.com/nt/for_f.html

PS: Thay đổi phím reg sử dụng nếu cần thiết.

1

rồi đây một số mẫu phức tạp hơn cho việc sử dụng Ví/F

:: Main 
@prompt -$G 
    call :REGQUERY "Software\Classes\CLSID\{3E6AE265-3382-A429-56D1-BB2B4D1D}" 

@goto :EOF 

:REGQUERY 
:: Checks HKEY_LOCAL_MACHINE\ and HKEY_CURRENT_USER\ 
:: for the key and lists its content 

    @call :EXEC "REG QUERY HKCU\%~1" 
    @call :EXEC "REG QUERY "HKLM\%~1"" 

@goto :EOF  

:EXEC 
    @set output= 

    @for /F "delims=" %%i in ('%~1 2^>nul') do @(
     set output=%%i 
    ) 

    @if not "%output%"=="" (
     echo %1 -^> %output% 
    ) 

@goto :EOF 

tôi đóng gói nó vào phụ chức năng : EXEC vì vậy tất cả các chi tiết khó chịu của nó thực hiện không lứa sự kịch bản chính. Vì vậy, nó có một số kinda một số hướng dẫn hàng loạt. Ghi chú 'bout mã:

  1. đầu ra từ lệnh được thực hiện thông qua gọi: EXEC lệnh được lưu trữ trong % sản lượng%. Hàng loạt cmd không quan tâm đến phạm vi để% output% cũng sẽ có sẵn trong kịch bản chính.
  2. @ bắt đầu chỉ là trang trí và ở đó để ngăn chặn lặp lại dòng lệnh. Bạn có thể xóa tất cả và chỉ cần đặt một số @echo tắt ở dòng đầu tiên thực sự không thích điều đó. Tuy nhiên như thế này tôi thấy gỡ lỗi tốt hơn nhiều. Trang trí Số hai là lời nhắc - $ G.Nó ở đó để làm cho command prompt trông như thế này ->
  3. tôi sử dụng :: thay vì rem
  4. dấu ngã (~) trong % ~ 1 là để loại bỏ dấu ngoặc kép từ số đầu tiên
  5. 2 ^> nul là để chặn/loại bỏ stderr lỗi đầu ra. Thông thường bạn sẽ làm điều đó thông qua 2> nul. Vâng, ^ các char thoát hàng loạt là có tránh để sớm giải quyết redirector (>). Có một số simulare sử dụng một chút sau đó trong kịch bản: echo %1 -^>... vì vậy có^làm cho nó có thể đầu ra một '>' thông qua echo những gì khác sẽ không có được có thể.
  6. ngay cả khi so sánh tại @if not "%output%"=="" trông giống như trong các ngôn ngữ lập trình phổ biến nhất - nó có thể khác với bạn mong đợi (nếu bạn không quen với MS-batch). Loại bỏ '@' ngay từ đầu. Nghiên cứu đầu ra. Thay đổi nó thành not %output%=="" -rerun và xem xét lý do tại sao điều này không hoạt động. ;)
Các vấn đề liên quan