Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 将命令输出馈送到for/f_Batch File_Cmd_Io Redirection - Fatal编程技术网

Batch file 将命令输出馈送到for/f

Batch file 将命令输出馈送到for/f,batch-file,cmd,io-redirection,Batch File,Cmd,Io Redirection,是否可以通过管道将命令输出作为输入传递到以下批处理文件 我想将诸如dirc:\temp | find“05”| find“new”等命令的输出馈送到以下批处理文件。因为我的命令有很多变体,我不想每次需要时都编辑批处理文件,因此,我正在寻找一种方法,将命令输出直接提供给批处理文件,而不是让批处理文件使用dir/b生成其输入。基本上,我想要实现的是从文件列表(使用dir命令生成)中查找名称包含最大数量的文件(使用批处理文件实现)。示例: 使用dir命令,我可以过滤掉今天或明天,只留下两个文件。然后,

是否可以通过管道将命令输出作为输入传递到以下批处理文件

我想将诸如
dirc:\temp | find“05”| find“new”
等命令的输出馈送到以下批处理文件。因为我的命令有很多变体,我不想每次需要时都编辑批处理文件,因此,我正在寻找一种方法,将命令输出直接提供给批处理文件,而不是让批处理文件使用
dir/b
生成其输入。基本上,我想要实现的是从文件列表(使用dir命令生成)中查找名称包含最大数量的文件(使用批处理文件实现)。示例:

使用dir命令,我可以过滤掉今天或明天,只留下两个文件。然后,将这两个文件馈送到批处理文件,并让它选择文件名中包含456的文件。当然,这是一个简化的例子。我可能比示例中的文件和组更多

for /f %%a in ('dir /b ^|sort /r ^|findstr /r [0-9]') do (
  set "filename=%%a"
  goto done
)
:done
echo the highest found is %filename%
exit /b 0

有很多方法。这是其中之一:

@echo off & set filename=
if "%~5" == "" set "myfind=dir /b ^| find "%~2" ^| find "%~3" ^| find "%~4" ^|sort /r ^|findstr /r [0-9]"
if "%~4" == "" set "myfind=dir /b ^| find "%~2" ^| find "%~3" ^|sort /r ^|findstr /r [0-9]"
if "%~3" == "" set "myfind=dir /b ^| find "%~2" ^|sort /r ^|findstr /r [0-9]"
if "%~2" == "" set "myfind=dir /b ^|sort /r ^|findstr /r [0-9]"

pushd "%~1"
for /f %%a in ('%myfind%') do (
  set "filename=%%a"
  goto done
)
:done
popd
if not defined filename echo Not match found & exit /b 1
echo the highest found is %filename%
exit /b 0
通常,您可以将其作为以下内容运行:

batch-file-name.cmd "C:\path\to\search" "search1" "search2" "search3"
例如,使用您的示例:

batch-file-name.cmd "c:\temp" "05" "new"
甚至扩展搜索范围:

batch-file-name.cmd "c:\temp" "05" "new" ".txt"
工作原理: 我们每次都设置搜索字符串,以防需要额外的
find
命令。目前,我们最多有三个发现和一条路径,但它可以扩展到更多。不过,您必须按降序进行设置。
我还添加了一个附加语句
(如果未定义文件名)
,以确保在查找不匹配时向您发出警报。

以下是给定组中的最高值:

@echo off
setlocal enabledelayedexpansion
set "search=today"
set "max=0"
for %%a in (%search%*.txt) do (
  set "name=%%~na"
  set "number=!name:%search%=!"
  if !number! gtr !max! set /a max=number
)
echo max number for %search% is %max%
set "highest=%search%%max%.txt"
echo %highest%
注意,根本没有错误检查,所以这取决于文件名的正确格式。(需要时可添加错误检查)


要获取搜索字符串作为参数,只需将
set“search=today”
替换为
set“search=%~1”

,这样您就可以将其作为
dir c:\temp | find“05”| find“new”
运行,并将输出作为批处理文件的输入了?很抱歉造成混淆。我对批处理文件不太了解。批处理文件将查找名称的编号最大的文件。我想要的是使用dir命令生成一个文件列表,并让批处理文件找出哪个文件的数量最大。@Gerhard dir命令可能会有所不同。它可能是06、10、12、03等,也可能不是新的,而是旧的,或者其他。在某些情况下,您可以使用更多来获取通过管道传输到批处理文件的输出,并在批处理文件中对其进行处理。我只是把你想完成的事情弄得有点混乱。您也可以制作一个批处理文件,执行所有目录等操作,并使用您提供的参数更改每次搜索的内容请澄清:所有文件的最大数量/一个组的最大数量(以相同文本开始)/每个组的最大数量?(顺便说一句:
batch
在这方面是一个非常糟糕的选择)效果非常好谢谢你花时间解决我的问题。谢谢你花时间解决我的问题。答案超出了我对shell命令的有限知识。我不知道如何修改它以适应我的需要。如何添加搜索目录和第二个搜索词?如果我理解正确,您可以查找a)a组(输入1)和B)该组中的最高数字(由我的代码确定)。第二个输入在哪里合适?
@echo off
setlocal enabledelayedexpansion
set "search=today"
set "max=0"
for %%a in (%search%*.txt) do (
  set "name=%%~na"
  set "number=!name:%search%=!"
  if !number! gtr !max! set /a max=number
)
echo max number for %search% is %max%
set "highest=%search%%max%.txt"
echo %highest%