Windows cmd.exe の同じコマンド ライン内で変数を設定して使用する

Windows cmd.exe の同じコマンド ライン内で変数を設定して使用する

Bash では、 を実行することができEDITOR=vim command、を に設定しcommandて実行しますが、これはシェル自体の の値には影響しません。 でこれを行うことは可能ですか?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 は実行後すぐに新しいコマンドを終了しますが、新しいコマンドで出力を生成すると、親ウィンドウに引き続き表示されます。

/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(遅延展開が必要になります)。

関連情報