Windows 对第一个查询结果运行命令的批处理文件?

Windows 对第一个查询结果运行命令的批处理文件?,windows,batch-file,cmd,command-prompt,Windows,Batch File,Cmd,Command Prompt,我想编写一个批处理文件,通过特定查询调用命令 所以我有 aaa-test-01.txt b-test-a-02.txt cc-test-03.txt //newset 查询: dir *test*.txt /o-d (获取所有自定义文件,按日期说明排序) 现在我想用记事本打开第一个结果 问题 如何创建批处理文件,以便能够像以下方式运行它: run.bat *test*.txt 批处理文件应具有以下内容: notepad %the file% 基本上,我想用最后一个最新文件打开记事本。可

我想编写一个批处理文件,通过特定查询调用命令

所以我有

aaa-test-01.txt
b-test-a-02.txt
cc-test-03.txt //newset
查询:

dir *test*.txt /o-d 
(获取所有自定义文件,按日期说明排序)

现在我想用记事本打开第一个结果

问题

如何创建批处理文件,以便能够像以下方式运行它:

run.bat *test*.txt
批处理文件应具有以下内容:

notepad %the file%

基本上,我想用最后一个最新文件打开记事本。

可以通过重定向文件输入来设置变量

==run.bat

@ECHO OFF
SET "TEMPFILE=%TEMP%\firstfile.tmp"
FOR /F "delims=" %%f IN ('DIR /B /A:-D /O:-D "%~1"') DO (ECHO>"%TEMPFILE%" %%~f")
SET /P "FIRSTFILE=" <"%TEMPFILE%"
notepad "%FIRSTFILE%"
IF EXIST "%TEMPFILE%" (DEL "%TEMPFILE%")
如果您想进入PowerShell并拥有当前版本5或更高版本,可以使用此选项

Get-ChildItem -File '*test*.txt' |
    Sort-Object -Property LastWriteTime |
    Select-Object -First 1 |
    ForEach-Object { & notepad $_.Name }

我建议您在
For/F
循环中运行该命令,反转日期顺序,以便在退出循环之前返回最新的第一个文件并对其执行操作(从而防止对下一个文件执行操作)

@For/F“Delims=“%%A In('Dir/B/A:-D/O:-D/T:C”*-test-*.txt“2^>Nul”)执行@Start”“Notepad”%%A”并退出/B

上面的示例使用最近创建的
C
日期,而不是
A
accessed或
W
rited(默认),在处输入
dir/?
以查看
dir
命令的可用用法信息。

您无需键入SET命令。它已在.bat文件脚本中。您所需要做的就是从命令行运行
run.bat
。@Compo为什么要执行
OD
而不是
O-d
?就您的示例而言,它运行在最旧的文件上,而不是最新的文件上……?请将您的评论作为答案发布。您能否详细说明
2^>Nul
?我知道
创建一个文件我正在重定向
目录中的任何STDERR输出,因为如果没有匹配的文本文件,返回的错误消息将传递到
Do
。如果改为将其发送到NUL设备,则不会传递任何信息,并且在该场景中循环不会运行
Do
Get-ChildItem -File '*test*.txt' |
    Sort-Object -Property LastWriteTime |
    Select-Object -First 1 |
    ForEach-Object { & notepad $_.Name }