我需要运行一个简单的find命令并将输出重定向到Windows批处理文件中的变量.
我试过这个:
set file=ls|find ".txt"
echo %file%
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
如果我运行此命令它没有问题:
set file=test.txt
echo %file%
Run Code Online (Sandbox Code Playgroud)
显然我的命令输出没有设置为我的变量.有人可以帮忙吗?谢谢
小智 9
我只是想知道如何在其中使用带有管道的命令,这是我的命令(它提取了svn repo的头部修订版):
SET SVN_INFO_CMD=svn info http://mySvnRepo/MyProjects
FOR /f "tokens=1 delims=" %%i IN ('%SVN_INFO_CMD% ^| find "Revision"') DO echo %%i
Run Code Online (Sandbox Code Playgroud)
首先,在UNIX shell中,您似乎对您的问题的期望是不可能的.shell应该如何知道这ls|find foo是一个命令而test.txt不是?在这里执行什么?这就是UNIX shell为这些东西提供反击的原因.无论如何,我离题了.
您不能将环境变量设置为shell中的多行字符串.所以我们现在有一个问题,因为输出ls不太合适.
但是,你真正想要的是所有文本文件的列表,对吧?根据您的需要,这很容易做到.所有这些示例中的主要部分是for循环,迭代一组文件.
如果您只需要为每个文本文件执行操作:
for %%i in (*.txt) do echo Doing something with "%%i"
Run Code Online (Sandbox Code Playgroud)
这甚至适用于带空格的文件名,并且不会错误地捕获只.txt在其名称中间有文件名的文件,例如foo.txt.bar.只是要指出你的方法并不像你想要的那样漂亮.
无论如何,如果你想要一个文件列表,你可以使用一个小技巧来创建数组,或类似的东西:
setlocal enabledelayedexpansion
set N=0
for %%i in (*.txt) do (
set Files[!N!]=%%i
set /a N+=1
)
Run Code Online (Sandbox Code Playgroud)
在此之后,你将有一些环境变量,故名Files[0],Files[1]等每一个包含一个文件名.你可以用它循环
for /l %%x in (1,1,%N%) do echo.!Files[%%x]!
Run Code Online (Sandbox Code Playgroud)
(注意我们在这里输出一个多余的新行,我们可以删除它但需要多行代码:-))
然后,如果您愿意,您可以构建一个非常长的文件名行.您可能会认识到这种模式:
setlocal enabledelayedexpansion
set Files=
for %%i in (*.txt) do set Files=!Files! "%%i"
Run Code Online (Sandbox Code Playgroud)
现在我们有一个很长的文件名.随心所欲地使用它.这有时很方便将一堆文件传递给另一个程序.
但请记住,批处理文件的最大行长度约为8190个字符.因此,这限制了您可以在一行中拥有的数量.是的,在一行中枚举一大堆文件可能会溢出.
回到原始点,批处理文件无法捕获命令输出.其他人之前已经注意到了.您可以for /f为此目的使用:
for /f %%i in ('dir /b') do ...
Run Code Online (Sandbox Code Playgroud)
这将遍历命令返回的行,并沿途对其进行标记.不像反叛者那样方便,但对于大多数目的而言足够接近和足够.
默认情况下,令牌会在空格中分解,因此如果您有一个文件名"Foo bar",那么突然您将只有"Foo" %%i和"bar" %%j.这可能会令人困惑,而这些事情是您不想仅仅使用文件列表的主要原因.for /f
如果与某些程序参数冲突,您也可以使用反引号而不是撇号:
for /f "usebackq" %%i in (`echo I can write 'apostrophes'`) do ...
Run Code Online (Sandbox Code Playgroud)
请注意,这也是令人信服的.您可以提供更多选项.它们在help for命令中有详细说明.
它在 DOS 中不可用,但在 Windows 控制台中,有 for 命令。只需在命令提示符下键入“help for”即可查看所有选项。要设置单个变量,您可以使用以下命令:
for /f %%i in ('find .txt') do set file=%%i
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于从“find .txt”返回的第一行,因为默认情况下 Windows 仅扩展变量一次。您必须启用延迟扩展,如此处所示。
| 归档时间: |
|
| 查看次数: |
42883 次 |
| 最近记录: |