Windows cmd.exeの同じコマンドライン内での変数の設定と使用


74

bashで、私が行うことができますEDITOR=vim commandcommandして実行される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を搭載したマシンでテストすると、cmdプロンプトがクラッシュします。
フェルナンドコスタベルトルディ16

EDITORがされることに注意してくださいではないに設定すること'vim'が、'vim '最後のコマンドで。末尾のスペースを避けるために、内部引用符を追加します。
Zitrax

@Zitrax右!それに応じて回答を編集しました。
VonC

1
NB:興味深い:この場合、スイッチの順序が重要です。cmd /v/c "..." 動作しcmd /c/v "..."ますが、失敗します-願わくば15分節約できることを願っています
-maoizm

1
@DerekGreer「実用的な理由は考えられない」:OK、答えを編集して実用的な理由を追加しました。
VonC

50

このようなウィンドウでは、何もインストールする必要はありません。

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「セット『EDITOR = vimの』 && &&これやることやる」
ゲルトK

1
これは、たとえば「Windows Server 2008」では機能しません。私はこれを試しました:set name = "username" && echo%username%。ユーザー名が空です。
アコジン

@akozinキーバリューを逆方向に取得したことに気付いていますか?もしかしてset name=foo&&echo %name%set username=foo&&echo %username%
プログズ

@akozin以下の私の答えを
-VonC

7

envGnuWin32 http://gnuwin32.sourceforge.net/のパッケージCoreUtilsから移植されたユーティリティを使用できます。

  1. 設定する
  2. env.exe%PATH%変数に存在するディレクトリを確認します
  3. Linuxバージョンと同じ方法を使用します env EDITOR=vim command

もしあなたがgit / docker / msys / cygwinを持っているなら、あなたはすでにこのバージョンを持っていると言う価値があるでしょう。
-xenoterracide

3

env.cmdLinux 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パラメーターの制限を取り除くために作成できます(遅延展開が必要になります)。


なぜ%*最後から2番目の行(つまり、:DoCmdラベルの後の行)として使用して、非常に長いユーザーコマンドを許可しないのでしょうか。
スコット

@Scott- 元のパラメーターリストであるため%*、影響を受けません(Unix とは異なります)。shift$*
AFH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.