Đặt giá trị của một biến bằng kết quả của một lệnh trong tệp lô Windows


98

Khi làm việc trong môi trường Bash , để đặt giá trị của một biến là kết quả của một lệnh, tôi thường làm:

var=$(command -args)

đâu varlà biến được đặt bởi lệnh command -args. Sau đó, tôi có thể truy cập biến đó bằng $var.

Một cách thông thường hơn để làm điều này tương thích với hầu hết mọi trình bao Unix là:

set var=`command -args`

Điều đó nói rằng, làm cách nào tôi có thể đặt giá trị của một biến bằng kết quả của một lệnh trong tệp lô Windows ? Tôi đã thử:

set var=command -args

Nhưng tôi thấy điều đó varđược đặt thành command -argsthay vì đầu ra của lệnh.

Câu trả lời:


62

Để thực hiện những gì Jesse mô tả , từ một tệp lô của Windows, bạn sẽ cần viết:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

Tuy nhiên, thay vào đó, tôi khuyên bạn nên sử dụng Cygwin trên hệ thống Windows của bạn nếu bạn đã quen với việc viết kịch bản kiểu Unix.


19
sử dụng for /f "delims=" %a in ('ver') do @set foobar=%atrên dấu nhắc lệnh. sử dụng for /f "delims=" %%a in ('ver') do @set foobar=%%atrong các tệp kịch bản
georg

Một giải pháp thay thế nhẹ là Gnu Trên Windows ( github.com/bmatzelle/gow/wiki ). Chỉ cần mở một dấu nhắc lệnh và chạy bash. Sau đó, bạn có thể viết các lệnh bash. Bạn cũng có thể thực thi các tập lệnh bash.
Nathan

4
Lưu ý rằng nếu lệnh của bạn bao gồm một dấu gạch ngang thì bạn cần phải thoát nó bằng dấu mũ, ví dụ: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ đặt foobar = %% a
yoyo

35

Bạn cần phải cẩn thận một chút, vì lệnh batch của Windows:

for /f "delims=" %%a in ('command') do @set theValue=%%a

không có cùng ngữ nghĩa với câu lệnh Unix shell:

theValue=`command`

Xem xét trường hợp lệnh bị lỗi, gây ra lỗi.

Trong phiên bản Unix shell, việc gán cho "theValue" vẫn xảy ra, mọi giá trị trước đó sẽ được thay thế bằng một giá trị trống.

Trong phiên bản hàng loạt của Windows, lệnh "for" sẽ xử lý lỗi và mệnh đề "do" không bao giờ đạt đến - vì vậy mọi giá trị trước đó của "theValue" sẽ được giữ lại.

Để có được nhiều ngữ nghĩa giống Unix hơn trong tập lệnh lô của Windows, bạn phải đảm bảo rằng việc gán diễn ra:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

Không xóa giá trị của biến khi chuyển đổi hàng loạt tập lệnh Unix sang Windows có thể là nguyên nhân gây ra các lỗi nhỏ.


2
Cảm ơn bạn đã giải thích sự khác biệt tinh tế giữa Windows và * nix.
Jeroen Wiert Pluimers

3
Ngoài ra, hãy nhớ thoát bất kỳ ký tự đặc biệt nào trong command; ví dụ: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart

@Bill_Stewart bạn vừa lưu ngày của tôi, trong một khoảnh khắc tôi nghĩ rằng nó là khó khăn hơn nhiều để gán đầu ra của lệnh đường ống cho một biến
MrBrody

19

Đây là cách tôi thực hiện khi tôi cần kết quả truy vấn cơ sở dữ liệu trong tệp lô của mình:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

Khóa ở dòng 2: "set / p" đặt giá trị của "result" thành giá trị của dòng đầu tiên (duy nhất) trong "__query.tmp" thông qua toán tử chuyển hướng "<".


14

Cách duy nhất tôi thấy nó được thực hiện là nếu bạn làm điều này:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver là phiên bản lệnh cho Windows và trên hệ thống của tôi, nó tạo ra:

Microsoft Windows [Version 6.0.6001]

Nguồ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.