我有一个Windows .bat文件,我想接受用户输入,然后使用输入的结果作为额外命令调用的一部分。
例如,我想从用户那里接受一个进程ID,然后针对这个ID运行jstack,将jstack调用的结果放到一个文件中。然而,当我尝试这样做时,它不起作用。
以下是我的示例bat文件内容:
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
下面是在jstack.txt中显示的内容:
Enter ID: Terminate batch job (Y/N)?
有两种可能。
您忘记在jstack调用中放入%id%。
Jstack %id% > Jstack .txt
所以整个正确的批处理文件应该是:
@echo off
set /p id=Enter ID:
echo %id%
jstack %id% > jstack.txt
和/或2。你确实把它放在代码中(并且忘记在问题中告诉我们),但是当你运行批处理文件时,你按了Enter键而不是键入ID(比如1234)。
现在发生的事情是这两个错误的结果:
Jstack应该使用您提供给它的id来调用。
但在你的情况下(根据你在问题中提供的代码),你调用它没有任何变量。你写的:
jstack > jstack.txt
所以当你运行不带变量的jstack时,它输出如下:
Terminate batch file Y/N?
Your second mistake is that you pressed Enter instead of giving a value when the program asked you: Enter ID:. If you would have put in an ID at this point, say 1234, the %id% variable would become that value, in our case 1234. But you did NOT supply a value and instead pressed Enter. When you don't give the variable any value, and if that variable was not set to anything else before, then the variable %id% is set to the prompt of the set command!! So now %id% is set to Enter ID: which was echoed on your screen as requested in the batch file BEFORE you called the jstack.
但是我怀疑您的批处理文件代码中确实有jstack %id% > jstack.txt,其中有%id(并且在问题中错误地省略了它),并且您没有键入id就按下了enter键。批处理程序然后返回id,现在是“Enter id:”,然后运行jstack Enter id: > jstack.txt
Jstack本身回显输入,遇到错误并要求终止。
所有这些都被写入了jstack.txt文件。
另一种方式可能会很有趣。你可以调用一个powershell脚本,在那里你可以做任何事情,并发送数据巴赫到cmd或做其他类似的事情。
set var=myvar;
call "c:\input2.cmd" %var%.
它更灵活(你可以用powershell同样的方式发送数据)。
所以在你的cmd中,考虑到ps脚本是在C::中编写的
PowerShell.exe -ExecutionPolicy unrestricted -Command "& {. C:\Input.ps1}"
在你的输入中。Ps1脚本,这样写:
$var = Read-Host -Prompt "Your input"
Write-Host "Your var:",$var
#Do stuff with your variable