我有一个Windows .bat文件,我想接受用户输入,然后使用该输入的结果作为调用其他命令的一部分。
例如,我想接受用户的进程ID,然后针对该ID运行jstack,将jstack调用的结果放入文件中。但是,当我尝试这个时,它不起作用。
这是我的样本文件内容:
@echo off
set /p id=Enter ID:
echo %id%
jstack > jstack.txt
这里是jstack.txt中显示的内容:
Enter ID: Terminate batch job (Y/N)?
答案 0 :(得分:379)
试试这个:
@echo off
set /p id="Enter ID: "
然后,您可以将%id%
作为参数用于另一个批处理文件,例如jstack %id%
。
例如:
set /P id=Enter id:
jstack %id% > jstack.txt
答案 1 :(得分:92)
语法如下:set /p variable=[string]
使用不同版本的Windows操作系统批处理文件,查看http://commandwindows.com/batch.htm或http://www.robvanderwoude.com/userinput.php以更深入地了解用户输入。
设置变量后,您可以按以下方式使用它。
@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%
请注意%VariableName%
语法
答案 2 :(得分:30)
我不确定所有版本的Windows是否都是这种情况,但是在我拥有的XP机器上,我需要使用以下内容:
set /p Var1="Prompt String"
如果没有引号中的提示字符串,我会根据文字得到各种结果。
答案 3 :(得分:13)
@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
答案 4 :(得分:12)
set /p choice= "Please Select one of the above options :"
echo '%choice%'
=
之后的空格非常重要。
答案 5 :(得分:7)
@echo off
:start
set /p var1="Enter first number: "
pause
答案 6 :(得分:7)
SETX没有记录/提示参数,因为有SET。
如果您需要提示一个在重新启动后仍然存在的环境变量,您可以使用SETX来存储它。
在重新启动命令提示符之前,SETX创建的变量不可用。但是,整齐地,您可以SETX一个已经设置过的变量,即使它具有相同的名称。
这适用于Windows 8.1 Pro:
set /p UserInfo= "What is your name? "
setx UserInfo "%UserInfo%"
(现有变量周围的引号是必要的。)
此过程允许您在当前会话期间使用临时SET创建的变量,并允许您在重新启动计算机或重新启动CMD提示时重用SETX创建的变量。
(编辑正确格式化代码段落。)
答案 7 :(得分:4)
我在为客户端准备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
答案 8 :(得分:3)
有两种可能性。
您忘了将%id%
放入jstack
来电。
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?
您的第二个错误是您在程序问您时按Enter键而不是给出值:Enter ID:
。如果此时你已经输入了一个ID,比如1234,那么%id%
变量就会变成那个值,在我们的例子中是1234.但是你没有提供一个值,而是按Enter键。当你没有给变量赋值时,如果之前没有设置该变量,那么变量%id%
被设置为set
命令的提示!!所以现在%id%
设置为Enter ID:
,在您调用jstack之前,在批处理文件中请求的屏幕上回显了jstack %id% > jstack.txt
。
但是我怀疑你的批处理文件代码中有%id
jstack Enter ID: > jstack.txt
(并且在问题中错误地省略了它),并且你输入了enter而没有输入id。批处理程序然后回显id,现在是“输入ID:”,然后运行describe('Login', () => {
beforeEach(async () => {
await device.reloadReactNative();
await grantAccessToUserWithValidCredentials();
});
it('A User Logs Out', async () => {
// here the app is ready for you specific log out use case
});
async function grantAccessToUserWithValidCredentials() {
//grant it
}
});
Jstack本身回应了输入,遇到了一个错误,并要求终止 所有这些都写入了jstack.txt文件。
答案 9 :(得分:2)
变量周围的美元符号在我的Vista机器上不起作用,但百分号表示。 另请注意,“设置”行上的尾随空格将显示在提示和用户输入之间。
答案 10 :(得分:1)
刚刚添加了
set /p NetworkLocation= Enter name for network?
echo %NetworkLocation% >> netlist.txt
序列到我的netsh批处理作业。它现在显示我作为该样本的点的响应位置。我一直在>>我现在知道的输出文件" home"," work"," Starbucks"等等。寻找清新的空气,我可以挖掘最低的使用渠道以及是否周围有5个或仅仅是所有2.4 MHz的WLAN。
答案 11 :(得分:1)
只保留变量的默认值。按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)。
答案 12 :(得分:0)
您也可以尝试使用使用HTML输入元素的userInput.bat。
这会将输入分配给值jstackId:
call userInput.bat jstackId
echo %jstackId%
这只会打印最终可以用FOR /F
捕获的输入值:
call userInput.bat
答案 13 :(得分:0)
另一种可能很有趣的方式。您可以在其中调用 powershell 脚本,您几乎可以在其中执行任何操作,并将数据发送到 cmd 或使用类似的方法执行其他操作。
set var=myvar;
call "c:\input2.cmd" %var%.
它更灵活(您可以使用 powershell 以相同的方式发送数据)。
因此在您的 cmd 中,考虑到 ps 脚本位于 C:
中:
PowerShell.exe -ExecutionPolicy unrestricted -Command "& {. C:\Input.ps1}"
在你的 input.ps1 脚本中,这样写:
$var = Read-Host -Prompt "Your input"
Write-Host "Your var:",$var
#Do stuff with your variable