Windowsの.batファイルがあります。これをユーザー入力を受け入れてから、その入力の結果を追加コマンドの呼び出しの一部として使用します。
たとえば、ユーザーからプロセスIDを受け取り、そのIDに対してjstackを実行して、jstack呼び出しの結果をファイルに入れたいとします。しかし、これを試すとうまくいきません。
これが私のサンプルのbatファイルの内容です。
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
これがjstack.txtに表示されるものです。
IDを入力してください:バッチジョブを終了しますか(Y/N)?
これを試して:
@echo off
set /p id="Enter ID: "
その後、%id%
を別のバッチファイルへのパラメータとしてjstack %id%
を使用できます。
例えば:
set /P id=Enter id:
jstack %id% > jstack.txt
構文は次のとおりです。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に当てはまるかどうかはわかりませんが、XPマシンでは、次のものを使用する必要があります。
set /p Var1="Prompt String"
quotes にプロンプト文字列がないと、テキストに応じてさまざまな結果が得られます。
@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
set /p choice= "Please Select one of the above options :"
echo '%choice%'
=
の後のスペースは非常に重要です。
@echo off
:start
set /p var1="Enter first number: "
pause
SETの場合とは異なり、SETXには文書化された/ Promptパラメーターはありません。
再起動後も存続する環境変数の入力を求める必要がある場合は、SETXを使用して保存することができます。
SETXによって作成された変数は、コマンドプロンプトを再起動するまで使用できません。ただし、同じ名前であっても、すでにSETされている変数をきれいにSETXすることができます。
これは私にとってWindows 8.1 Proでうまくいきます。
set /p UserInfo= "What is your name? "
setx UserInfo "%UserInfo%"
(既存の変数を囲む引用符は必要です。)
この手順では、現在のセッション中に一時的なSETで作成された変数を使用できます。また、コンピュータの再起動時またはCMDプロンプトの再起動時にSETXで作成された変数を再利用できます。
(コード段落を正しくフォーマットするように編集されています。)
私はクライアントにPCを準備する際に私が使用して少しCMDを持っている:それは、ユーザに入力を呼び出し、それに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
2つの可能性があります。
jstack
呼び出しに%id%
を入れるのを忘れました。
jstack %id% > jstack.txt
したがって、正しいバッチファイル全体は次のようになります。
@echo off
set /p id=Enter ID:
echo %id%
jstack %id% > jstack.txt
そして/または2.あなたはそれをコードに入れました(そして質問で私達に言うのを忘れていました)しかしあなたがバッチファイルを走らせたときあなたはIDをタイプする代わりにEnterキーを押しました(例えば1234)。
起こっていることはこれら二つの間違いの結果です: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:
に設定され、バッチファイルで要求されたとおりに画面に表示されます。
しかし、私はあなたがDIDあなたのバッチファイルのコードの中にjstack %id% > jstack.txt
を持つ%id
を持っていて(そして質問からそれを間違って省略していた)、そしてあなたがidをタイプせずにエンターを押したのではないでしょうか。その後、バッチプログラムはIDをエコーしました。これは「Enter ID:」になり、jstack Enter ID: > jstack.txt
を実行しました。
Jstack自体が入力をエコーし、間違いに遭遇して終了を求めました。
そして、これらすべてがjstack.txtファイルに書き込まれました。
変数を囲むドル記号は私のVistaマシンでは機能しませんが、パーセント記号は機能します。また、「設定」行の末尾のスペースがプロンプトとユーザー入力の間に表示されます。
追加したばかり
set /p NetworkLocation= Enter name for network?
echo %NetworkLocation% >> netlist.txt
私のnetshバッチジョブへのシーケンス。そのサンプルのポイントとして私が応答した場所が表示されます。出力ファイルを継続的に>>出力するので、 "home"、 "work"、 "Starbucks"などがわかります。澄んだ空気を探して、最も使用頻度の低いチャネルを探しています。
変数のデフォルト値をそのままにします。最近実行した.batのデフォルトを使用するには、Enterキーを押します。
@echo off
set /p Var1=<Var1.txt
set /p Var1="Enter new value ("%Var1%") "
echo %Var1%> Var1.txt
rem YourApp %Var1%
最初の実行では、変数の初期値を持つファイルが足りないというメッセージを無視します(または手動でVar1.txtを作成します)。