การตั้งค่าและการใช้ตัวแปรภายในบรรทัดคำสั่งเดียวกันใน Windows cmd.exe


75

ใน Bash ฉันสามารถทำได้EDITOR=vim commandและcommandจะEDITORตั้งค่าเป็นvimแต่จะไม่ส่งผลกระทบต่อมูลค่าของEDITORเชลล์ เป็นไปได้ไหมที่จะทำเช่นนี้cmd.exe?

คำตอบ:


52

โปรดทราบว่าcmd /C "set "EDITOR=vim" && echo %EDITOR%"จะไม่ทำงาน
หรือจะcmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

สิ่งที่จะเป็น/Vตัวเลือกในการเปิดใช้งานการขยายตัวของตัวแปรสภาพแวดล้อมล่าช้าโดยใช้!เป็นตัวคั่น

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

ในฐานะที่ระบุไว้ด้านล่างโดยmaoizmมันเป็นcmd /V /C, ไม่ cmd /C /V (ซึ่งจะไม่ทำงาน)


ฉันไม่สามารถนึกถึงเหตุผลเชิงปฏิบัติใด ๆ ที่คุณต้องการได้ในบริบทของคำสั่งเดียว

โดยทั่วไปคุณต้องการสิ่งนี้เมื่อคุณต้องแทนที่ค่าที่ใช้หลายครั้งในบรรทัดคำสั่งยาว
ตัวอย่างเช่นในการปรับใช้ไฟล์กับ Nexus (ในหลายบรรทัดเพื่อให้สามารถอ่านได้):

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

แทนที่จะต้องเปลี่ยนกลุ่มสิ่งประดิษฐ์ (ใช้ 2 ครั้ง) และเวอร์ชันในบรรทัดคำสั่งที่ยาวและซับซ้อนคุณสามารถแก้ไขได้ที่จุดเริ่มต้นของคำสั่งที่กล่าวไว้ มีความชัดเจน / ง่ายกว่าในการจัดการและเปลี่ยนค่าพารามิเตอร์


1
ทดสอบกับเครื่องของฉันด้วย Windows 10 รุ่น 1607 พรอมต์คำสั่งล่ม
Fernando Costa Bertoldi

โปรดทราบว่า EDITOR จะไม่ถูกตั้งค่าเป็น'vim'แต่'vim 'ในคำสั่งสุดท้าย เพิ่มเครื่องหมายคำพูดภายในเพื่อหลีกเลี่ยงพื้นที่ในท้ายที่สุด
Zitrax

@Zitrax ถูกต้อง! ฉันได้แก้ไขคำตอบแล้ว
VonC

1
หมายเหตุ: น่าสนใจ: ลำดับของสวิตช์มีความสำคัญในกรณีนี้ cmd /v/c "..." ทำงานได้ แต่cmd /c/v "..."ล้มเหลว - หวังว่าจะช่วยให้คุณประหยัดได้ 15 นาที
maoizm

1
@DerekGreer "ฉันไม่สามารถนึกถึงเหตุผลเชิงปฏิบัติใด ๆ ": ตกลงฉันได้แก้ไขคำตอบเพื่อเพิ่มเหตุผลจริง
VonC

50

คุณสามารถทำได้ใน windows เช่นนี้ไม่จำเป็นต้องติดตั้งอะไร

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

คุณจะเห็นรายการตัวแปรและคุณจะเห็น EDITOR = vim ตอนนี้เรียกใช้ "set" อีกครั้งและมันจะไม่ปรากฏในรายการ

คุณสามารถทำหลาย && เพื่อเพิ่มคำสั่งเพิ่มเติม:

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

แก้ไข: / C ออกจาก cmd ใหม่ทันทีหลังจากทำงานหากคุณสร้างเอาต์พุตด้วยอันใหม่มันจะยังคงมองเห็นได้ในหน้าต่างหลัก

คุณสามารถเลือกที่จะใช้ / K ในกรณีที่หน้าต่าง cmd ใหม่ยังคงเปิดอยู่เมื่อสิ้นสุดการรัน


5
ระวัง. การตั้งค่าตัวแปรด้วยวิธีนี้จะส่งผลให้เกิดช่องว่างในการติดตามในตัวแปร EDITOR: "vim" เพื่อหลีกเลี่ยงการใช้พื้นที่ในการติดตาม: cmd / C "set" EDITOR = vim "&& ทำสิ่งนี้ && ทำอย่างนั้น"
Gerd K

1
สิ่งนี้ไม่ทำงานใน "Windows Server 2008" ตัวอย่างเช่น ฉันได้ลองแล้ว: set name = "ชื่อผู้ใช้" && echo% ชื่อผู้ใช้% และชื่อผู้ใช้ว่างเปล่า
akozin

@akozin คุณรู้หรือไม่ว่าคุณได้รับความคุ้มค่าย้อนหลัง? คุณหมายถึงset name=foo&&echo %name%หรือset username=foo&&echo %username%?
Phrogz


7

คุณสามารถใช้ ported util envจากแพ็คเกจ CoreUtils ใน GnuWin32 http://gnuwin32.sourceforge.net/

  1. ติดตั้งมัน
  2. ตรวจสอบว่ามีไดเรกทอรีใดบ้างenv.exeในตัวแปร% PATH%
  3. ใช้วิธีเดียวกันกับรุ่น linux env EDITOR=vim command

อาจจะพูดได้ว่าถ้าคุณมีคอมไพล์ / นักเทียบท่า / msys / cygwin คุณจะมีเวอร์ชันนี้อยู่แล้ว
xenoterracide

3

ฉันเคาะไฟล์แบตช์env.cmdซึ่งทำงานได้มากกว่าหรือน้อยกว่าเช่นenvคำสั่ง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

ความแตกต่างเพียงอย่างเดียวคือเนื่องจากวิธีcmdแจงการมอบหมายสภาพแวดล้อมจำเป็นต้องอ้างถึงดังนั้นคำสั่งของคุณจะเป็น:

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

ไฟล์แบตช์สามารถทำรายละเอียดเพื่อลบข้อ จำกัด 8 พารามิเตอร์โดยการสร้างสตริงคำสั่งภายในforลูป (จำเป็นต้องมีการขยายตัวล่าช้า)


ทำไมไม่ใช้%*เป็นบรรทัดสุดท้าย (เช่นอันถัดจาก:DoCmdเลเบล) เพื่ออนุญาตให้ใช้คำสั่งผู้ใช้ที่ยาวมาก?
สกอตต์

@Scott - เพราะ%*เป็นรายการพารามิเตอร์ดั้งเดิม : มันไม่ได้รับผลกระทบจากshift(ต่างจาก$*Unix)
AFH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.