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

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

在 Bash 中,我可以执行EDITOR=vim command并将设置command为 来运行,但这不会影响shell 本身的值。在 中可以这样做吗?EDITORvimEDITORcmd.exe

答案1

请注意,这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'
# or
C:\> cmd /V /C "set "EDITOR=vim" && echo '!EDITOR!'"
'vim'

作为如下所述经过毛主义, 这是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 次)和版本,而是可以在开始所述命令。操作和更改参数值更加清晰/容易。

答案2

您可以在 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 窗口在运行结束时保持打开状态。

答案3

您可以使用envGnuWin32 中 CoreUtils 包中的移植实用程序http://gnuwin32.sourceforge.net/

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

答案4

我编写了一个批处理文件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]

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

相关内容