如何在Windows上作为批处理文件的一部分提供控制台输入(是/否)?

25
我正在编写一个简单的批处理文件(remove.bat),用于删除一个目录及其所有子目录。该文件包含以下命令-
rmdir /S modules

其中modules是非空目录的名称。

我收到以下信息 -

C:\...\bin>rmdir /S modules
modules, Are you sure (Y/N)?

我该如何在批处理文件中提供控制台输入"Y"来回答上面的Y/N问题?是否有相应的命令可以实现?
7个回答

65
正如其他人指出的那样,你应该使用/Q选项。但是还有另一种“老派”的方法可以做到这一点,在那个命令没有选项来抑制确认消息的日子里使用。只需ECHO所需的响应并将值导入命令即可。
echo y|rmdir /s modules

我建议使用/Q选项,但如果你遇到一个没有提供抑制确认消息选项的命令,管道技术可能很重要。
注意 - 只有当命令从stdin读取输入时,这种技术才有效,这在cmd.exe内部命令中始终如此。但对于一些外部命令可能不适用。

谢谢,这是一个非常好的开箱即用的答案,也适用于除rmdir之外的其他命令。 - Ben Croughs
1
有用的技巧,在一个令人烦恼的PAUSE命令出现“按任意键继续……”提示后,可以关闭命令窗口! - cody.codes
我正在尝试在Windows上静默生成ssh密钥。但是这种方法似乎不起作用。 echo ''| ssh-keygen.exe -t rsa -f ./id_rsa -q. 我不想为密钥设置任何密码,所以我将其保留为空。但提示未捕获echo文本。 - rbansal
@rbansal,你最好发一个新问题。可以参考这个帖子,然后问你具体的问题。祝你好运! - bballdave025
这个不起作用。echo Y | net user j: /delete 的输出是“未提供有效的响应”。 - Philip Rego
@PhilipRego - 你有没有看答案底部的注释?我怀疑外部的net命令没有从stdin读取。 - dbenham

12

要删除非空目录,请使用rmdir /S,而不提示请使用rmdir /Q。将它们结合起来,使用rmdir /S /Q可以安静地删除非空目录。


4

使用rmdir /S /Q modules命令。

/Q参数会禁止出现确认提示框。


3

您可以做到

rmdir /Q

Q代表安静


1

我想补充一点,虽然不适用于Rmdir,但在某些情况下,强制开关也可能是解决方案。因此,从一般意义上讲,您应该查看命令开关的/f、/q或某种变体(例如,Netdom RenameComputer使用/Force而不是/f)。

回显管道是一个很好的技巧,非常有用,因为您不总能找到合适的开关。例如,我认为这是绕过Y/N提示的唯一方法...

Echo y|NETDOM COMPUTERNAME WorkComp /Add:Work-Comp

链接到几乎相同的StackOverflow帖子


两年后,你决定发布一个没有提供任何新信息的答案!为什么?而且你的第一句话是错误的——/Q选项是“强制”选项,正如前三个答案中已经说明的那样。 - dbenham
@dbenham 我理解你的观点,但是... 1.) 如果这个结果仍然在谷歌上,为什么两年后会成为问题呢?2.) “新信息”的例子是,你可能需要寻找另一个命令的类似开关,它不总是/q或/f,但那些是很好的第一猜测。3.) 我想你可以对第一句话挑剔,但它提出了其他帖子没有提到的一个很好的观点。“force”这个词让我期望“Y”行为,而“quiet”这个词让我想到“Y”或“N”。如果没有提供/S,RmDir /Q实际上为非空文件夹提供“N”行为。 - u8it
@dbenham 我同意这个答案并没有太多的帮助...我实际上是将其作为回答我的Netdom问题的答案发布的。我想分享一下我在不同情况下发现有效的方法,但认为这与另一个问题太相似了,而且我总是犹豫是否要发布和回答自己的问题...所以我把它附加在这里...也许应该分开。 - u8it
@dbenham,此外,这个答案包含了一个类似的帖子链接,在那里可以看到 quiet <> force。当考虑“del /f /q”情况时,它们显然是不同的。 - u8it

1
如果您使用的不是英语/美国本地化的Windows系统,则可能需要获取适用于您的计算机所需的答案
@echo off

setlocal

set "ans_yes="
set "ans_no="
set "ans_all="

copy /y nul # >nul

for /f "tokens=2-7 delims=[(/)]" %%a in ( '
    copy /-y nul # ^<nul
' ) do if not defined ans_yes if "%%~e" == "" (
    set "ans_yes=%%~a"
    set "ans_no=%%~b"
    set "ans_all=%%~c"
) else (
    set "ans_yes=%%~a"
    set "ans_no=%%~c"
    set "ans_all=%%~e"
)

del /q #

set "ans_yes=%ans_yes: =%"
set "ans_no=%ans_no: =%"
set "ans_all=%ans_all: =%"

set "ans_y=%ans_yes:~0,1%"
set "ans_n=%ans_no:~0,1%"
set "ans_a=%ans_all:~0,1%"

endlocal & (
    set "ans_y=%ans_y%"
    set "ans_n=%ans_n%"
    set "ans_a=%ans_a%"
)

echo %ans_y%|rmdir /s modules

当一个人在多语言和/或跨国编码环境/组织/生活中工作时,这非常有用。对此点赞。 - bballdave025

1

YES.EXE

Yes是一个很棒的工具,它将持续回答任何需要输入的进程的“Yes”、“No”或其他内容。

如果你单独运行它,它只会不断输出y+enter。但这并不是它的真正用途。它的用途是用于管道传输到另一个正在寻找响应提示的程序中。

最简单的用法:

yes|rd temp /s

你可以使用yes.exe来输出任何参数或字符串(警告:愚蠢的例子):

yes hello world用于简单的基本10 PRINT "Hello World": GOTO 10

它的真正用途:

它用于命令行工具,这些工具可能有重复的提示,但没有内置的/y/n

例如,你正在复制文件并不断收到Overwrite? (Yes/No/All)提示,你被卡住了,必须一遍遍地按下“N”键。以下是解决方法:

yes n|copy * c:\stuff

如何获取?

这只是GNU Core Utils for Windows的一小部分,为Windows用户提供基本的Linux命令。如果您经常编写批处理文件,这些非常有用。
如果您已经安装 Git for Windows,则已经拥有它,以及GNU Core Utils的其他部分。请检查您的PATH,它可能位于C:\Users\USERNAME\AppData\Local\Programs\Git\usr\bin
如果您需要下载Windows二进制文件,则可以从许多不同的地方获得,但最受欢迎的可能是 https://cygwin.com/packages/summary/coreutils.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接