& thật bất ngờ vào lúc này


1

Tôi có một tệp bó được cho là đặt một số biến ở đầu.

for /f %%A in ('wmic os get osarchitecture ^| find /i "bit"') do set "OSARCH=%%A"
for /f "skip=1 tokens=4" %%B in ('wmic product where "name like 'Microsoft .NET%'" get name') do set "DNVER=%%B"
for /f "tokens=3" %%C in ('reg query "HKLM\SOFTWARE\Microsoft\Internet Explorer" /v svcVersion' do set "IEFULLVER=%%C"
set IEVER=%IEFULLVER:~0,4%

Nếu tôi chạy các lệnh này trong dấu nhắc CMD, (thay thế %% A cho% A, v.v.), chúng hoạt động như mong đợi, nhưng khi tôi chạy tệp bó, dòng đầu tiên chạy như mong đợi và sau đó tôi gặp & was unexpected at this timelỗi. Tôi nghĩ rằng nó có thể được thực hiện %sau đó .NET, nhưng nó phải ở đó nếu không truy vấn wmi sẽ không trả về giá trị tôi cần.


Tại sao dòng thứ ba thiếu dấu ngoặc đơn phải? Điều gì xảy ra nếu, sau dòng đầu tiên, bạn thêm: ECHO %OSARCH%và sau dòng thứ hai hiện tại, bạn thêm ECHO %DNVER%và sau dòng thứ ba hiện tại, bạn thêm ECHO %IEFULLVER%, và sau dòng thứ 4 hiện tại , ECHO %IEVER%? (Ngay cả khi bạn vẫn nhận được lỗi, có thể rất vui khi thấy bạn gặp lỗi ở đâu, so với một số đầu ra khác có thể tồn tại.)
QUÁN NGÀY

Nó thiếu dấu ngoặc đơn vì tôi là một tấm ván và không nhận thấy lỗi!
MarkCrawford

Câu trả lời:


1

"& không ngờ vào lúc này"

Có hai lỗi trong tệp bó của bạn.

Sai lầm 1:

for /f "skip=1 tokens=4" %%B in ('wmic product where "name like 'Microsoft .NET%'" get name') do set "DNVER=%%B"

Lệnh trên cần phải có đơn %sau khi NETthoát. Sử dụng %%thay thế:

for /f "skip=1 tokens=4" %%B in ('wmic product where "name like 'Microsoft .NET%%'" get name') do set "DNVER=%%B"

Sai lầm 2:

for /f "tokens=3" %%C in ('reg query "HKLM\SOFTWARE\Microsoft\Internet Explorer" /v svcVersion' do set "IEFULLVER=%%C"

Lệnh trên bị thiếu một )trước do. Nó nên là:

for /f "tokens=3" %%C in ('reg query "HKLM\SOFTWARE\Microsoft\Internet Explorer" /v svcVersion') do set "IEFULLVER=%%C"

Tệp bó làm việc (test.cmd):

@echo off
setlocal EnableDelayedExpansion
for /f %%A in ('wmic os get osarchitecture ^| find /i "bit"') do set "OSARCH=%%A"
for /f "skip=1 tokens=4" %%B in ('wmic product where "name like 'Microsoft .NET%%'" get name') do set "DNVER=%%B"
for /f "tokens=3" %%C in ('reg query "HKLM\SOFTWARE\Microsoft\Internet Explorer" /v svcVersion') do set "IEFULLVER=%%C"
echo %OSARCH%
echo %DNVER%
echo %IEFULLVER%
endlocal

Ví dụ đầu ra:

F:\test>test
64-bit
4.5.2
11.0.9600.17691

Phần trăm thoát

%tự có ý nghĩa đặc biệt cho các tham số dòng lệnh và tham số FOR.

Để coi phần trăm là một nhân vật thông thường, hãy nhân đôi nó:

%%

Cú pháp nguồn


Đọc thêm


Xin chào David, Cảm ơn bạn đã trả lời, sửa chữa những sai lầm đã làm việc hoàn hảo. Sau khi đọc về FOR ​​trên SS64 vài lần tối qua, nó đã không chìm trong việc nhân đôi% ký tự được áp dụng cho chuỗi cũng như các tham số.
MarkCrawford
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.