Cài đặt và sử dụng biến trong cùng một dòng lệnh trong Windows cmd.exe


75

Trong Bash, tôi có thể làm EDITOR=vim commandcommandsẽ được chạy với EDITORcài đặt vim, nhưng điều này sẽ không ảnh hưởng đến giá trị của EDITORchính nó. Có thể làm điều này trong cmd.exe?

Câu trả lời:


52

Lưu ý rằng cmd /C "set "EDITOR=vim" && echo %EDITOR%"sẽ không hoạt động.
Cũng khôngcmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

Điều gì sẽ là /Vtùy chọn, cho phép mở rộng biến môi trường chậm sử dụng !như dấu phân cách.

C:\> cmd /V /C "set EDITOR=vim&& echo !EDITOR!"
vim

Như đã nêu dưới đây bằng cách maoizm , đó là cmd /V /C, không cmd /C /V (mà sẽ không làm việc)


Tôi không thể nghĩ ra bất kỳ lý do thực tế nào mà bạn thực sự muốn điều này trong bối cảnh của một lệnh

Thông thường, bạn cần điều này khi bạn phải thay thế một giá trị được sử dụng nhiều lần trong một dòng lệnh dài.
Chẳng hạn, để triển khai một tệp lên Nexus (trong nhiều dòng để dễ đọc):

cmd /v /c "set g=com.agroup&& set a=anArtifact&& set v=1.1.0&& \
           mvn deploy:deploy-file -Dfile=C:\path\!a!-!v!.jar \
           -Dpackaging=jar -DgroupId=!g! -DartifactId=!a! -Dversion=!v! \
           -DrepositoryId=nexus 
           -Durl=http://myserver/nexus/content/repositories/my-repo/"

Thay vì phải thay thế nhóm, tạo tác (được sử dụng 2 lần) và phiên bản trong một dòng lệnh dài và phức tạp, bạn có thể chỉnh sửa chúng khi bắt đầu lệnh đã nói. Nó rõ ràng hơn / dễ dàng hơn để thao tác và thay đổi các giá trị tham số.


1
Đã thử nghiệm nó trên máy của tôi với Windows 10 phiên bản 1607, dấu nhắc cmd.
Fernando Costa Bertoldi

Lưu ý rằng EDITOR sẽ không được đặt thành 'vim'nhưng 'vim 'trong lệnh cuối cùng. Thêm các trích dẫn nội bộ để tránh không gian cuối cùng.
Zitrax

@Zitrax Đúng! Tôi đã chỉnh sửa câu trả lời cho phù hợp.
VonC

1
NB: thú vị: thứ tự các công tắc quan trọng trong trường hợp này. cmd /v/c "..." hoạt động, nhưng cmd /c/v "..."thất bại - hy vọng nó có thể giúp bạn tiết kiệm 15 phút
maoizm

1
@DerekGreer "Tôi không thể nghĩ ra bất kỳ lý do thực tế nào": OK, tôi đã chỉnh sửa câu trả lời để thêm một lý do thực tế.
VonC

50

Bạn có thể làm điều đó trong các cửa sổ như thế này không cần cài đặt gì cả.

cmd /C "set EDITOR=vim && set"

Bạn sẽ thấy một danh sách các biến và bạn sẽ thấy EDITOR = vim, bây giờ chạy lại "set" và nó sẽ không được liệt kê.

Bạn có thể thực hiện nhiều && để thêm các lệnh bổ sung:

cmd /C "set EDITOR=vim && do this && do that && otherstuff"

EDIT: / C thoát khỏi cmd mới ngay sau khi chạy, nếu bạn tạo đầu ra với cái mới, nó sẽ vẫn hiển thị trong cửa sổ cha.

Bạn có thể chọn sử dụng / K trong trường hợp cửa sổ cmd mới vẫn mở khi kết thúc hoạt động.


5
Hãy cẩn thận. Đặt biến theo cách này sẽ dẫn đến một khoảng trắng trong biến EDITOR: "vim". Để tránh không gian dấu, hãy sử dụng: cmd / C "đặt" EDITOR = vim "&& làm điều này && làm điều đó"
Gerd K

1
Điều này không hoạt động trên "Windows Server 2008", ví dụ. Tôi đã thử điều này: đặt tên = "tên người dùng" && echo% tên người dùng%. Và tên người dùng trống.
akozin

@akozin Bạn có nhận ra rằng bạn có giá trị ngược không? Ý của bạn là set name=foo&&echo %name%hay set username=foo&&echo %username%?
Phrogz


7

bạn có thể sử dụng port được sử dụng envtừ gói CoreUtils trong GnuWin32 http://gnuwin32.sourceforge.net/

  1. Cài đặt nó
  2. Kiểm tra thư mục env.exenào tồn tại trong biến% PATH%
  3. Sử dụng tương tự như phiên bản linux env EDITOR=vim command

có lẽ đáng nói rằng nếu bạn có git / docker / msys / cygwin thì bạn đã có phiên bản này.
xenoterracide

3

Tôi đã gõ một tệp bó env.cmdhoạt động ít nhiều như envlệnh Linux : -

echo off
setlocal
for %%f in (%*) do (
  echo %%f|find "=" >nul:
  if errorlevel 1 goto DoCmd
  set %%f
  shift
)
:DoCmd
%1 %2 %3 %4 %5 %6 %7 %8 %9
endlocal

Sự khác biệt duy nhất là, do cách cmdphân tích cú pháp, các bài tập môi trường cần được trích dẫn, vì vậy lệnh của bạn sẽ là:

env "EDITOR=vim" command [up to 8 parameters]

Tệp bó có thể được xây dựng để loại bỏ giới hạn 8 tham số bằng cách xây dựng chuỗi lệnh trong forvòng lặp (sẽ cần mở rộng chậm).


Tại sao không chỉ sử dụng %*như dòng áp chót (tức là dòng sau :DoCmdnhãn) để cho phép các lệnh người dùng rất dài?
Scott

@Scott - Vì %*là danh sách tham số ban đầu : nó không bị ảnh hưởng bởi shift(không giống như $*trong Unix).
AFH
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.