ChatGPT解决这个技术问题 Extra ChatGPT

在 Windows cmd 中,如何提示用户输入并在另一个命令中使用结果?

我有一个 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)?
“终止批处理作业(是/否)?”通常会在 .bat 运行时按 ctrl-c 显示。
Jstack.txt 将包含来自 jstack 的输出,并且与您的批处理文件无关,而且您还没有说 Jstack 是什么。
这些答案都不起作用吗?如果没有,您找到解决方案了吗?如果你这样做了,如果你把它发布在这里作为自我回答会很有帮助。
如果您想要输入的固定选项,最好使用 choice 而不是 set /p
请将我的帖子标记为答案,其本质是在运行批处理程序时您按 Enter 而不是在提示符处提供 ID,因此 %id% 设置为 Enter ID: 而不是您应该设置的某个 ID从键盘提供。

G
Gerhard

尝试这个:

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

然后,您可以将 %id% 用作另一个批处理文件(如 jstack %id%)的参数。

例如:

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

有没有办法将 SET 命令的输出传递给 NIL:,这样你就可以隐藏输入?就像您想要执行 a: set /p id=Enter ID:\r\n set /p pw=Enter Passwd: 并且不希望密码文本显示在窗口中一样,更不用说显示在“DosKey”命令缓冲区中?我尝试了几种不同的方法,除了编写一个小 C 程序来获取输入并将其分配给 EnvVar 之外,还没有找到一种方法,但那是作弊! :) 我希望它与 JUST Windows CMD 一起工作。
请注意在 "Enter ID: " 末尾添加的空格。在提示和用户答案之间留出一个甜蜜的小空间。 Delete the internet?No sillyDelete the internet? No silly
不需要引号。 @Instansoup 缺少的是第 jstack %id% > jstack.txt 行中的“%id%”
如果您希望将变量保持在当前批次的本地,请使用 SETLOCALENDLOCAL。请参阅ss64.com/nt/endlocal.html
Z
Zitrax

语法如下:set /p variable=[string]

查看 http://commandwindows.com/batch.htmhttp://www.robvanderwoude.com/userinput.php 以更深入地了解不同版本的 Windows 操作系统批处理文件的用户输入。

设置变量后,您可以按照以下方式使用它。

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

注意 %VariableName% 语法


请完成您的句子...您要包含另一个链接吗?此外,我在 Windows 7 cmd.exe shell 中测试了以上所有内容,并且每个 - 无一例外 - 将用户输入分配给任意命名的变量。您的回复如何修饰已经提供的内容?
当我发布我的答案时,看起来并没有真正回答原始问题。最初的问题是“你如何要求用户输入,然后转身并在另一个命令中使用它?”我相信我的回答简洁地回答了这个问题。另外,当您在 Google 中搜索“如何从批处理文件中获取用户输入”时,这个问题在结果中排名第 2,因此它需要正确的答案,而我认为这个论坛是针对的。
= 之后的空格不是必需的。
为什么我们需要空间?不允许空间的 cmd 到底发生了什么?
@Joey 我同意,robvanderderwoude.com page 没有空间SET /P variable=[promptString]
G
Grimthorr
set /p choice= "Please Select one of the above options :" 
echo '%choice%'

= 之后的空格非常重要。


E
Erik Philips

我不确定所有版本的 Windows 是否都是这种情况,但是在我拥有的 XP 机器上,我需要使用以下内容:

set /p Var1="Prompt String"

如果没有引号中的提示字符串,我会根据文本得到各种结果。


+1“取决于文本的各种结果”:我遇到了同样的问题。现在它用文本打印引号,但没有更多奇怪的行为。
使用此语法拥有引号,但避免显示它们:set /p "var1=Prompt String"
使用引号并在末尾包含一个空格很有用,因为它使命令行上的提示更好。有了引号,很明显批处理文件中有一个空格。 set /p Var1="Prompt String " 然后,当您运行文件并且用户键入内容时,您会得到 Prompt String Yes 而不是 Prompt StringYes
E
Eamorr
@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 

T
Timothy J. McGowan

SETX 没有像 SET 那样记录在案的 /prompt 参数。

如果您需要提示一个在重启后仍能保留的环境变量,您可以使用 SETX 来存储它。

在您重新启动命令提示符之前,SETX 创建的变量将无法使用。然而,巧妙地,您可以对已设置的变量进行设置,即使它具有相同的名称。

这适用于 Windows 8.1 Pro:

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

(现有变量周围的引号是必要的。)

此过程允许您在当前会话期间使用由 SET 创建的临时变量,并允许您在重新启动计算机或重新启动 CMD 提示时重新使用由 SETX 创建的变量。

(编辑以正确格式化代码段落。)


C
Carl H
@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 这可能是习惯问题...
n
npocmaka

您也可以尝试使用使用 html 输入元素的 userInput.bat

https://i.stack.imgur.com/5audK.png

这会将输入分配给值 jstackId:

call userInput.bat jstackId
echo %jstackId%

这只会打印最终您可以使用 FOR /F 捕获的输入值:

call userInput.bat

优秀的解决方案。谢谢!
p
pashute

有两种可能性。

您忘记将 %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 文件。


W
Werdna

我在为客户端准备 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

再次嗨,这个有用的脚本在初始设置后在 Win10 电脑上使用:-)
S
SRE

变量周围的美元符号在我的 Vista 机器上不起作用,但百分号可以。另请注意,“set”行上的尾随空格将显示在提示符和用户输入之间。


尾随空间? win7 x64 rus: C:\>set /p DestPath="Type path:" 下一行是 Type path:c:\dddd
$ 符号用于 bash 或 unix 变量。 %% 符号用于 windows 变量。
如果批处理文件中有 SETLOCAL ENABLEDELAYEDEXPANSION,则可以在 FOR 循环期间使用 !EnvVariable! 将其扩展为它的值,或者在 Cmd 解析器实际处理该行之前不扩展宏的其他内容。有关这方面的信息,请参见 cmd /?,以及 help setlocal...
E
ElektroStudios

刚刚添加了

set /p NetworkLocation= Enter name for network?

echo %NetworkLocation% >> netlist.txt

序列到我的 netsh 批处理作业。它现在向我显示我响应的位置作为该样本的点。我不断地>>输出文件,所以我现在知道“家”、“工作”、“星巴克”等。寻找清晰的空气,我可以评估最低使用频道以及周围是否有 5 个或全部 2.4 MHz WLAN。


A
Antoni

只是为了保持变量的默认值。按 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,您提案的第二部分没有保留运行之间的值!?你能开发更多吗?
不,不是在运行之间。它只是给出一个默认值。 (没有请求在问题的运行之间存储值)。
A
Andy McRae

另一种可能很有趣的方式。您可以调用一个 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