在Windows cmd.exe的同一命令行中设置和使用变量


Answers:


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版的计算机上对其进行了测试,cmd提示崩溃。
费尔南多·哥斯达黎加贝托尔迪

请注意,编辑器将不会被设置为'vim',但'vim '在最后的命令。添加内部引号可避免最后出现空格。
Zitrax

@Zitrax对!我已经相应地编辑了答案。
VonC

1
注意:有趣:在这种情况下,开关的顺序很重要。cmd /v/c "..."cmd /c/v "..."
可行

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,如果使用新的cmd产生输出,它将在父窗口中仍然可见。

您可以选择使用/ K,在这种情况下,新的cmd窗口在运行结束时保持打开状态。


5
小心。以这种方式设置变量将在变量EDITOR:“ vim”中产生尾随空格。为避免使用尾随空格,请使用:cmd / C“ set” EDITOR = vim“ &&做到这一点&&做到这一点
Gerd K

1
例如,这不适用于“ Windows Server 2008”。我试过这个:set name =“ username” && echo%username%。用户名为空。
akozin

@akozin您是否意识到向后获得键值?你是说set name=foo&&echo %name%还是set username=foo&&echo %username%
Phrogz

@akozin 在下面
VonC

7

您可以env在GnuWin32 http://gnuwin32.sourceforge.net/中使用来自软件包CoreUtils的移植工具。

  1. 设置它
  2. 检查env.exe%PATH%变量中存在的目录
  3. 使用与Linux版本相同的方式 env EDITOR=vim command

也许值得一提的是,如果您拥有git / docker / msys / cygwin,您将已经拥有一个此版本。
xenoterracide

3

我已经敲打了一个批处理文件env.cmd,该批处理文件或多或少像Linux env命令一样工作:-

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]

可通过在for循环内建立命令字符串来详细说明批处理文件,以消除8参数限制(将需要延迟扩展)。


为什么不仅仅%*用作倒数第二行(即:DoCmd标签后的那一行)以允许很长的用户命令?
斯科特

@Scott-因为%*原始参数列表:它不受shift(与$*Unix中不同)的影响。
AFH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.