我有一个 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)?
choice
而不是 set /p
Enter ID:
而不是您应该设置的某个 ID从键盘提供。
尝试这个:
@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 操作系统批处理文件的用户输入。
设置变量后,您可以按照以下方式使用它。
@echo off
set /p UserInputPath=What Directory would you like?
cd C:\%UserInputPath%
注意 %VariableName%
语法
cmd.exe
shell 中测试了以上所有内容,并且每个 - 无一例外 - 将用户输入分配给任意命名的变量。您的回复如何修饰已经提供的内容?
=
之后的空格不是必需的。
cmd
到底发生了什么?
SET /P variable=[promptString]
set /p choice= "Please Select one of the above options :"
echo '%choice%'
=
之后的空格非常重要。
我不确定所有版本的 Windows 是否都是这种情况,但是在我拥有的 XP 机器上,我需要使用以下内容:
set /p Var1="Prompt String"
如果没有引号中的提示字符串,我会根据文本得到各种结果。
set /p "var1=Prompt String"
set /p Var1="Prompt String "
然后,当您运行文件并且用户键入内容时,您会得到 Prompt String Yes
而不是 Prompt StringYes
@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
SETX 没有像 SET 那样记录在案的 /prompt 参数。
如果您需要提示一个在重启后仍能保留的环境变量,您可以使用 SETX 来存储它。
在您重新启动命令提示符之前,SETX 创建的变量将无法使用。然而,巧妙地,您可以对已设置的变量进行设置,即使它具有相同的名称。
这适用于 Windows 8.1 Pro:
set /p UserInfo= "What is your name? "
setx UserInfo "%UserInfo%"
(现有变量周围的引号是必要的。)
此过程允许您在当前会话期间使用由 SET 创建的临时变量,并允许您在重新启动计算机或重新启动 CMD 提示时重新使用由 SETX 创建的变量。
(编辑以正确格式化代码段落。)
@echo off
:start
set /p var1="Enter first number: "
pause
:start
开始?
:start
只是一个标记...例如,他也可能使用 :end
,这会导致发生变量清理或调用 popd
之类的事情。然后,您还可以选择使用 IF ERRORLEVEL1 GOTO END
... 甚至 GOTO ERR
,并且在 :err
下有类似 echo An Error occurred while trying to get the file number。 goto:end 这可能是习惯问题...
您也可以尝试使用使用 html 输入元素的 userInput.bat。
https://i.stack.imgur.com/5audK.png
这会将输入分配给值 jstackId:
call userInput.bat jstackId
echo %jstackId%
这只会打印最终您可以使用 FOR /F
捕获的输入值:
call userInput.bat
有两种可能性。
您忘记将 %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
(并且在问题中错误地省略了它),并且您在没有输入 ID 的情况下按 Enter 键。然后批处理程序回显 id,现在是“输入 ID:”,然后运行 jstack Enter ID: > jstack.txt
Jstack 本身回应了输入,遇到错误并要求终止。而这一切都被写入了 jstack.txt 文件。
我在为客户端准备 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
变量周围的美元符号在我的 Vista 机器上不起作用,但百分号可以。另请注意,“set”行上的尾随空格将显示在提示符和用户输入之间。
C:\>set /p DestPath="Type path:"
下一行是 Type path:c:\dddd
SETLOCAL ENABLEDELAYEDEXPANSION
,则可以在 FOR 循环期间使用 !EnvVariable!
将其扩展为它的值,或者在 Cmd 解析器实际处理该行之前不扩展宏的其他内容。有关这方面的信息,请参见 cmd /?
,以及 help setlocal
...
刚刚添加了
set /p NetworkLocation= Enter name for network?
echo %NetworkLocation% >> netlist.txt
序列到我的 netsh 批处理作业。它现在向我显示我响应的位置作为该样本的点。我不断地>>输出文件,所以我现在知道“家”、“工作”、“星巴克”等。寻找清晰的空气,我可以评估最低使用频道以及周围是否有 5 个或全部 2.4 MHz WLAN。
只是为了保持变量的默认值。按 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
而不是从文件中获取内容
另一种可能很有趣的方式。您可以调用一个 powershell 脚本,您可以在其中执行几乎任何操作,并将数据 bach 发送到 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
set /p id=Enter ID:\r\n set /p pw=Enter Passwd:
并且不希望密码文本显示在窗口中一样,更不用说显示在“DosKey”命令缓冲区中?我尝试了几种不同的方法,除了编写一个小 C 程序来获取输入并将其分配给 EnvVar 之外,还没有找到一种方法,但那是作弊! :) 我希望它与 JUST Windows CMD 一起工作。"Enter ID: "
末尾添加的空格。在提示和用户答案之间留出一个甜蜜的小空间。Delete the internet?No silly
与Delete the internet? No silly
。jstack %id% > jstack.txt
行中的“%id%”SETLOCAL
和ENDLOCAL
。请参阅ss64.com/nt/endlocal.html