Windows cmdで、ユーザー入力を要求し、その結果を別のコマンドで使用するにはどうすればよいですか?


398

Windowsの.batファイルを持っています。これをユーザー入力を受け入れ、その入力の結果を追加のコマンドの呼び出しの一部として使用します。

たとえば、ユーザーからプロセスIDを受け入れ、そのIDに対してjstackを実行し、jstack呼び出しの結果をファイルに入れたいと思います。しかし、これを試してもうまくいきません。

これが私のサンプルbatファイルの内容です。

@echo off
set /p id=Enter ID: 
echo %id%
jstack > jstack.txt

そして、jstack.txtに表示される内容は次のとおりです。

IDを入力:バッチジョブを終了しますか(Y / N)? 

2
「バッチジョブを終了しますか(Y / N)?」通常、.batの実行中にctrl-cを押すと表示されます。
ジムバック

2
Jstack.txtには、jstackからの出力とバッチファイルに関連する何も含まれていません。また、Jstackとは何も言っていません。
sgmoore 2012

1
これらの答えはどれもうまくいきませんでしたか?そうでない場合、解決策は見つかりましたか?もしそうなら、ここに自己回答として投稿していただけると助かります。
マスラー、2015

1
あなたが入力するためのオプションを固定したい場合は、使用した方がいいでしょうchoiceよりset /p
icc97

2
私の投稿を回答としてマークしてください。その本質は、バッチプログラムを実行するときに、プロンプトでIDを入力する代わりにEnterキーを押すため、%id%がEnter ID: 、提供するはずのIDではなくに設定されていたことです。キーボード。
パシュテー

回答:


459

これを試して:

@echo off
set /p id="Enter ID: "

次に%id%、などの別のバッチファイルへのパラメータとして使用できますjstack %id%

例えば:

set /P id=Enter id: 
jstack %id% > jstack.txt

2
SETコマンドの出力をNIL:にパイプする方法はありますか?そうすれば、タイピングを隠すことができますか?set /p id=Enter ID:\r\n set /p pw=Enter Passwd:たとえば、パスワードテキストをウィンドウに表示したくなく、「DosKey」コマンドバッファに表示したくない場合は、私はいくつかの異なる方法を試しましたが、入力を取得してEnvVarに割り当てる小さなCプログラムを書く以外に、これを行う方法を見つけることができませんでしたが、それは不正行為です!:) Windows CMDだけで動作するようにしたい。
LarryF 2016年


4
の最後に追加されたスペースの美しさに注意してください"Enter ID: "。プロンプトとユーザーの応答の間に甘い小さなスペースを与えます。Delete the internet?No sillyDelete the internet? No silly
icc97 2016

引用符は必要ありません。@Instantsoupに欠けていたのは、行の「%id%」jstack %id% > jstack.txt
でした

1
変数を現在のバッチに対してローカルに保つ場合はSETLOCAL、andを使用しENDLOCALます。ss64.com/nt/endlocal.htmlを
endo64

99

構文は次のとおりです。 set /p variable=[string]

http://commandwindows.com/batch.htmまたはhttp://www.robvanderwoude.com/userinput.phpで、さまざまなバージョンのWindows OSバッチファイルを使用したユーザー入力の詳細を確認してください

変数を設定したら、次の方法で変数を使用できます。

@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%

%VariableName%構文に注意してください


文章を完成させてください...別のリンクを含めますか?また、上記のすべてをWindows 7 cmd.exeシェルでテストしました。それぞれ例外なく、ユーザー入力を任意の名前の変数に割り当てました。すでに提供されているものに対するあなたの反応はどのように装飾されていますか?
12

3
私が回答を投稿したとき、元の質問が回答されたようには見えませんでした。元の質問は、「ユーザー入力を要求してから方向転換して別のコマンドで使用するにはどうすればよいですか?」私の答えは簡潔に質問に答えたと思います。さらに、Googleで「バッチファイルからユーザー入力を取得するにはどうすればよいですか」を検索すると、この質問の結果は#2なので、このフォーラムが対象とした正しい答えが必要です。
jayfessenden 2012

14
後のスペース=は必要ありません。
Joey

なぜスペースが必要なのですか?cmdスペースを許可しないもので正確に何が起こっていますか?
ytpillai 2015

@Joey同意する、robvanderderwoude.comページにスペースがないSET /P variable=[promptString]
icc97

31

これがすべてのバージョンのWindowsに当てはまるかどうかはわかりませんが、私が持っているXPマシンでは、以下を使用する必要があります。

set /p Var1="Prompt String"

プロンプト文字列を引用符囲まないと、テキストによってさまざまな結果が得られます。


「テキストによってさまざまな結果」の+1:同じ問題が発生しました。これでテキストとともに引用符が印刷されますが、これ以上奇妙な動作はありません。
Benj

6
この構文を使用する必要があり、引用符を、しかし避ける示すそれらを:set /p "var1=Prompt String"
ステファン

コマンドラインのプロンプトが見やすくなるので、引用符を使用し、末尾にスペースを含めると便利です。引用符があると、バッチファイルにスペースがあることが明らかになります。set /p Var1="Prompt String "次に、ファイルを実行し、ユーザーがPrompt String Yes代わりに取得したものを入力するとPrompt StringYes
icc97


14
@echo off
set /p input="Write something, it will be used in the command "echo""
echo %input%
pause

私があなたが望むものを手に入れれば、これはうまくいきます。他のコマンドでも%input%を使用できます。

@echo off
echo Write something, it will be used in the command "echo"
set /p input=""
cls
echo %input%
pause 

8
@echo off
:start
set /p var1="Enter first number: "
pause

2
なぜあなたは始め:startますか?
Benj

1
:startは単なるマーカーです...たとえば、彼はを使用する:endこともできます。これにより、変数のクリーンアップなどが発生したり、を呼び出しpopdたりすることができます。次に、IF ERRORLEVEL1 GOTO END...またはを使用するオプションもあります。また、echo GOTO ERRなどのオプションがあり :err、ファイル番号を取得しようとしたときにエラーが発生しました。goto:endおそらく癖のある

8

SETの場合とは異なり、SETXの/ promptパラメータは文書化されていません。

リブート後も存続する環境変数を要求する必要がある場合は、SETXを使用して保存できます。

SETXによって作成された変数は、コマンドプロンプトを再起動するまで使用できません。ただし、同じ名前であっても、既に設定されている変数をSETXすることはできます。

これは私にとってWindows 8.1 Proで動作します:

set /p UserInfo= "What is your name?  "
setx UserInfo "%UserInfo%"

(既存の変数を囲む引用符が必要です。)

この手順により、現在のセッション中にSETで作成された一時変数を使用でき、コンピューターの再起動時またはCMDプロンプトの再起動時にSETX作成された変数を再利用できます。

(コード段落を適切にフォーマットするために編集されました。)


5

クライアントにPCを準備するときに使用する小さなコマンドがあります。入力のためにユーザーを呼び出し、PCの名前をそれに変更します。

@ECHO "remember to run this as admin."
@ECHO OFF
SET /P _inputname= Please enter an computername:
@ECHO Du intastede "%_inputname%"
@ECHO "The pc will restart after this"
pause
@ECHO OFF
wmic computersystem where name="%COMPUTERNAME%" call rename name="%_inputname%"

shutdown -r -f

こんにちは、この便利なスクリプトは、初期セットアップ後にWin10 PCで使用されます:-)
Werdna

5

2つの可能性があります。

  1. に電話をかけるの%id%を忘れましたjstack

    jstack %id% > jstack.txt
    

したがって、正しいバッチファイル全体は次のようになります。

@echo off
set /p id=Enter ID: 
echo %id%
jstack %id% > jstack.txt

And / Or 2.コードに挿入しました(そして、質問に答えるのを忘れていました)が、バッチファイルを実行すると、IDを入力する代わりにEnterキーを押しました(たとえば1234)。

起こっていることはこれらの2つの間違いの結果です: jstackしたIDで呼び出されることになっています。

しかし、あなたの場合(質問で提供したコードによると)、変数なしでそれを呼び出しました。あなたが書いた:

jstack > jstack.txt

したがって、jstack変数なしで実行すると、次のように出力されます。

Terminate batch file Y/N? 

2つ目の間違いは、プログラムから次のように要求されたときに、値を入力する代わりにEnterキーを押したことです Enter ID:。この時点でID、たとえば1234を入力した場合、%id%変数はその値(この場合は1234)になります。ただし、値を指定せずに、Enterキーを押しました。変数に値を指定せず、その変数が他に何も設定されていなかった場合、変数はコマンドの%id%プロンプトに設定されますset!! そのため、jstackを呼び出す前に、バッチファイルで要求されたとおりに画面にエコー%id%されEnter ID:たに設定されます。

しかし、私jstack %id% > jstack.txtはあなたがあなたのバッチファイルコードにを持っている%id(そして質問から間違ってそれを省略した)、そしてあなたがIDを入力せずにEnterキーを押したのではないかと思います。次に、バッチプログラムは、IDをエコーし​​ます。これは「Enter ID:」になり、実行されました。jstack Enter ID: > jstack.txt

Jstack自体が入力をエコーし​​、ミスに遭遇して終了するように要求しました。
そして、これらすべてがjstack.txtファイルに書き込まれました。


3

変数の周りのドル記号はVistaマシンでは機能しませんが、パーセント記号は機能します。また、「設定」行の末尾のスペースがプロンプトとユーザー入力の間に表示されることにも注意してください。


末尾のスペース?win7 x64 rus:C:\>set /p DestPath="Type path:"次の行はType path:c:\dddd
Arioch 'The

2
$記号はbashまたはunix変数用です。%%記号はWindows変数用です。
noob 2013年

あなたが持っている場合はSETLOCAL ENABLEDELAYEDEXPANSION、あなたのバッチファイルでは、使用することができます!EnvVariable!ループ、またはラインが実際にCmdをパーサによって処理されるまで、マクロのを展開しません、他のもののための間、その値にそれを展開します。cmd /?これと同様の情報については、help setlocal...を参照してください
LarryF 2016

2

追加したばかり

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

netshバッチジョブのシーケンス。これで、応答する場所がそのサンプルのポイントとして表示されます。私は絶えず>>出力ファイルを知っているので、「自宅」、「職場」、「スターバックス」などを知ることができます。澄んだ空気を探して、最低使用チャネルと5つまたは2.4 MHzのWLANがあるかどうかを確認できます。


2

変数のデフォルト値を保持するだけです。Enterキーを押して、.batを最近実行したときのデフォルトを使用します。

@echo off
set /p Var1=<Var1.txt
set /p Var1="Enter new value ("%Var1%") "
echo %Var1%> Var1.txt

rem YourApp %Var1%

最初の実行では、変数の初期値を含むファイルがないというメッセージを無視します(またはVar1.txtを手動で作成します)。


(set /p var=<var1.txt) 2>nulエラーメッセージを非表示にします。set var1=defaultファイルから何かを取得する代わりに与えることもできます
Stephan

ステファン、提案の2番目の部分では、実行間の値が保持されません!?もっと開発できますか?
アントニ

いいえ、実行の間ではありません。デフォルト値を指定するだけです。(質問の実行間で値を保存する要求はありませんでした)。
Stephan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.