Pengaturan dan penggunaan variabel dalam baris perintah yang sama di Windows cmd.exe

61

Di Bash, aku bisa melakukannya EDITOR=vim command dan command akan dijalankan bersama EDITOR mulai vim, tetapi ini tidak akan memengaruhi nilai EDITOR di shell itu sendiri. Apakah mungkin untuk melakukan ini di cmd.exe?

Alexey Romanov
sumber

Jawaban:

43

Catat itu cmd /C "set "EDITOR=vim" && echo %EDITOR%" tidak akan bekerja
Tidak akan cmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

Apa yang akan /V opsi, untuk mengaktifkan ekspansi variabel lingkungan tertunda menggunakan ! sebagai pembatas.

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

Sebagai tercantum di bawah ini oleh maoizm , ini cmd /V /C, tidak cmd /C /V (yang akan tidak kerja)


Saya tidak dapat memikirkan alasan praktis apa pun yang pernah Anda inginkan sebenarnya dalam konteks satu perintah

Biasanya, Anda memerlukan ini ketika Anda harus mengganti nilai yang digunakan beberapa kali dalam baris perintah yang panjang.
Misalnya, untuk menggunakan file ke Nexus (dalam beberapa baris agar mudah dibaca):

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/"

Alih-alih harus mengganti grup, artefak (digunakan 2 kali) dan versi di baris perintah yang panjang dan kompleks, Anda dapat mengeditnya di awal dari perintah tersebut. Lebih jelas / mudah untuk memanipulasi dan mengubah nilai parameter.

VonC
sumber
Mengujinya di komputer saya dengan Windows 10 versi 1607, prompt cmd lumpuh.
Fernando Bertoldi
Perhatikan bahwa EDITOR akan melakukannya tidak diatur ke 'vim' tapi 'vim ' di perintah terakhir. Tambahkan kutipan internal untuk menghindari ruang pada akhirnya.
Zitrax
@Zitrax Benar! Saya telah mengedit jawaban sesuai dengan itu.
VonC
Berdasarkan solusi yang diberikan saya menciptakan cara untuk mengakses ERRORLEVEL dari dua perintah yang berjalan pada baris perintah yang sama: cmd /v /c "dir file1.txt >NUL 2>&1 & echo !ERRORLEVEL! & dir file2.txt >NUL 2>&1 & echo !ERRORLEVEL!"
sactiw
NB: menarik: urutan switch penting dalam kasus ini. cmd /v/c "..." bekerja, tapi cmd /c/v "..." gagal - semoga bisa menghemat 15 menit
maoizm
46

Anda dapat melakukannya di windows seperti ini tidak perlu menginstal apa pun.

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

Anda akan melihat daftar variabel dan Anda akan melihat EDITOR = vim, sekarang jalankan "set" lagi dan itu tidak akan terdaftar.

Anda dapat melakukan banyak & amp; & amp; untuk menambahkan perintah tambahan:

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

EDIT: / C keluar cmd baru segera setelah berjalan, jika Anda menghasilkan output dengan yang baru itu akan tetap terlihat di jendela induk.

Anda dapat memilih untuk menggunakan / K dalam hal ini jendela cmd baru tetap terbuka di akhir proses.

Viper_Sb
sumber
4
Hati-hati. Mengatur variabel dengan cara ini akan menghasilkan ruang trailng dalam variabel EDITOR: "vim". Untuk menghindari spasi tambahan, gunakan: cmd / C "set" EDITOR = vim "& amp; & amp; lakukan ini & amp; & amp; lakukan itu"
Gerd K
1
Ini tidak berfungsi pada "Windows Server 2008", misalnya. Saya mencoba ini: set name = "username" & amp; & amp; gema% nama pengguna%. Dan nama pengguna kosong.
akozin
@akozin Apakah Anda menyadari bahwa Anda mendapatkan nilai kunci mundur? Apakah yang kamu maksud set name=foo&&echo %name% atau set username=foo&&echo %username%?
Phrogz
@akozin lihat jawaban saya di bawah ini
VonC
@VonC, terima kasih untuk jawabannya. Ini bekerja untuk saya!
akozin
7

Anda dapat menggunakan util porting env dari paket CoreUtils di GnuWin32 http://gnuwin32.sourceforge.net/

  1. Siapkan itu
  2. Periksa dengan direktori apa env.exe ada dalam variabel% PATH%
  3. Gunakan cara yang sama seperti versi linux env EDITOR=vim command
Red Skotina
sumber
mungkin layak dikatakan bahwa jika Anda memiliki git / docker / msys / cygwin Anda sudah memiliki versi ini.
xenoterracide
3

Saya telah mengetuk file batch env.cmd yang bekerja kurang lebih seperti Linux env perintah:-

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

Satu-satunya perbedaan adalah, karena caranya cmd parses, penugasan lingkungan perlu dikutip, jadi perintah Anda adalah:

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

File batch dapat diuraikan untuk menghapus pembatasan 8-parameter dengan membangun string perintah di dalam for loop (ekspansi yang tertunda akan diperlukan).

AFH
sumber
Kenapa tidak pakai saja %* sebagai garis kedua dari belakang (yaitu, yang setelah :DoCmd label) untuk memungkinkan perintah pengguna yang sangat lama?
Scott
@Scott - Karena %* adalah asli daftar parameter: tidak terpengaruh oleh shift (tidak seperti $* di Unix).
AFH