web-dev-qa-db-ja.com

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

Bashでは、EDITOR=vim commandを実行することができ、commandEDITORvimに設定して実行されますが、これはシェル自体のEDITORの値には影響しません。これをcmd.exeで行うことは可能ですか?

69
Alexey Romanov

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 /Cnotcmd /C /V(これはnot動作しません)


私はあなたが実際にこれを単一のコマンドの文脈の中で欲しいと思う実用的な理由を考えることはできません。

通常、長いコマンドラインで複数回使用された値を置き換える必要があるときにこれが必要になります。
例えば、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/"

長く複雑なコマンドラインでgroup、artifact(2回使用)、versionを置き換えなくても、上記のコマンドの先頭で編集できます。パラメータ値を操作して変更する方が明確で簡単です。

49
VonC

あなたは何もインストールする必要はありませんこのようにWindowsでそれを行うことができます。

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

変数のリストが表示され、EDITOR = vimが表示されます。今度はもう一度 "set"を実行します。リストには表示されません。

追加のコマンドを追加するために複数の&&を行うことができます。

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

編集:/ Cは、実行後すぐに新しいcmdを終了します。新しいコマンドを使用して出力を生成した場合は、親ウィンドウに表示されたままになります。

/ Kを使用することを選択できます。その場合、新しいcmdウィンドウは実行の終了時に開いたままになります。

49
Viper_Sb

gnuWin32のCoreUtilsパッケージから移植されたutil envを使用できます http://gnuwin32.sourceforge.net/

  1. 設定する
  2. %PATH%変数にenv.exeを持つディレクトリが存在するか確認してください
  3. Linux版のenv EDITOR=vim commandと同じように使う
7
Red Skotina

私はLinuxのenvコマンドのように動作するバッチファイルenv.cmdをノックアップしました: -

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パラメータの制限をなくすことができます(遅延展開が必要になります)。

3
AFH