读取文件中的命令通常但并非总是支持从处理程序 STDIN 中读取数据。管道字符 | 将应用程序 A 写入到处理程序 STDOUT 的输出重定向到应用程序 B 的处理程序 STDIN。有关详细信息,请阅读 Microsoft 文章
使用命令重定向运算符和 SS64 文章
重定向。
哪些控制台应用程序支持从 STDIN 输入是文档问题。Windows 安装的只有少数几个控制台应用程序支持从 STDIN 输入。但是,有许多第三方控制台应用程序支持从 STDIN 输入。其中许多在文档中未明确说明可以从 STDIN 读取输入,而不仅仅是从指定为参数的输入文件中读取。但是,通过一次尝试很快就可以找出是否支持从 STDIN 输入数据。
支持STDIN的标准Windows控制台应用程序包括FIND、FINDSTR和MORE、SORT等。
大多数标准Windows控制台应用程序和cmd.exe
的内部命令不处理文件内容,因此不支持STDIN。有关Windows标准命令的列表,请参见Microsoft的命令行参考。但是,有关Windows标准命令行命令的更多详细信息可在SS64.com - Windows CMD命令行的A-Z索引链接的网页上找到。
将一个应用程序的STDOUT重定向到另一个应用程序的STDIN非常常见,因为许多第三方控制台应用程序支持来自STDIN的输入。每个编译器/脚本解释器都会将消息写入STDOUT,将致命错误消息写入STDERR,许多GUI文本编辑器和IDE应用程序将这些消息重定向以捕获、过滤并将其打印到程序员的GUI窗口中。这种重定向使用与Windows命令解释器提供的重定向运算符>
和 >>
和|
相同的机制进行。
通常,所有支持从键盘输入的控制台应用程序也支持从输出或另一个应用程序或文件重定向的STDIN输入。但总会有例外,例如某些应用程序出于安全原因而设计为仅直接从键盘接受输入,而不是从句柄STDIN接受输入,例如不是应用程序或脚本应该确认/输入什么,而是通过键盘使用的真正人类用户。
命令
SET用于为环境变量分配值,或将1个或多个环境变量的值输出到
STDOUT,或计算算术表达式,或提示批处理用户从
STDIN读取字符串。该命令不适用于从文件读取或写入文件。
但是,使用
set /P
和特殊语法,可以将应用程序的输出重定向到环境变量,如
jeb在他的答案中所述。但这种方法很少使用,我认为原因是所需表达式的复杂性。
然而,演示代码是为了将当前时间分配给环境变量。通常有一个命令参数或另一个功能可以避免需要将文本重定向到命令或控制台应用程序的
STDIN。获取具有当前时间值的环境变量也是如此。
有预定义的环境变量DATE和TIME。在命令提示符窗口中运行set /?
并阅读所有输出帮助页面。在最后一页上列出了一些常用于批处理文件的特殊环境变量,包括DATE和TIME的说明。
尝试使用以下命令:
echo Current date is %DATE% and current time is %TIME%
请注意,
%DATE%
和
%TIME%
返回的日期和时间字符串格式取决于Windows区域和语言设置(国家)的当前设置。因此,只有在批处理文件始终在已知日期/时间格式的同一台计算机上执行且不更改时,才使用
%DATE%
和
%TIME%
。否则,最好使用
wmic.exe OS get localdatetime
。有关Windows上日期/时间用法的更多详细信息,请参见
Find out if file is older than 4 hours in Batch file上的答案。
命令
FOR可用于将应用程序输出的字符串分配给一个或多个环境变量。在命令提示符窗口中运行
for /?
以获取有关此命令的帮助。使用
FOR的方法通常用于将应用程序输出或从文件中读取的文本分配给环境变量。
批处理文件示例:
@echo off
for /F %%I in ('time /T') do set "a=%%I"
echo Time is %a%
SET /P
命令,它可以接受用户输入和标准输入。 - jebset /P
(提示方法)将来自文件或其他应用程序的字符串分配给环境变量,因为我根本不想“滥用”一个为其他目的而设计的功能,即使它是可能的。因此,我真的忘记了这种方法。我也从不使用echo Y | del *
,因为这仅适用于英语Windows,而使用del /Q *
则独立于Windows的语言。但感谢您对我的答案进行评论并纠正其中一个重要点。 - Mofi