我试图完成以下任务可笑:

我有一个包含一组完全合格filesnames的文本文件。我想通过文件迭代和每行追加到一个共同的变量,可以传递一个命令行工具。例如,该文件可能是:

  

C:\ DIR \ test.txt的

     

C:\ Windows \的test2.txt

     

C:\ text3.txt

和我想将它们分配给一些变量“a”,使得:

a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"

一个次要问题是 - 什么是好的批处理文件引用?我发现在Windows材料一些东西,很多土生土长的网站,但没有特别完整。

有帮助吗?

解决方案

至于参考, SS64.com 是不坏。 罗布范德瓦Woude 被链接相当频繁,太


至于你的问题,那很简单:

@echo off
setlocal enableextensions enabledelayedexpansion

set LIST=
for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

echo %LIST%

endlocal

更深入的说明:

setlocal enableextensions enabledelayedexpansion

我们允许的延迟扩展的位置。这是关键,因为否则我们将无法操作后面的for循环中的文件列表。

for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

for /f遍历文件中的行,所以正是我们需要在这里。在每次循环迭代,我们追加下一行到LIST变量。注意使用!LIST!而不是通常的%LIST%的。这个信号延迟扩展,并确保变量被重新评估每运行此命令的时间。

一般cmd尽快膨胀变量及其值作为一行被读出并进行解析。对于cmd单行既可以是计数的直线,这恰好持有由像我们这里使用的一个括号分隔块真线或一切。因此,对于cmd完整的块是被读取和解析一次一个说法,不管多久循环运行的内部。

如果我们会这里使用%LIST%代替!LIST!那么变量会被立即通过其值(空在该点)代替并且环看起来会是这样的:

for /f %%x in (yourfile.txt) do (
    set LIST= "%%x"
)

显然,这不是我们想要的。延迟扩展可以确保真正需要它的值时,变量不仅扩大。在这种情况下,当循环运行的内部和构造的文件名的列表。

此后,将可变%LIST%!LIST!(现在它并不重要了使用哪一个)包含从文件中的行的列表。

有趣的是,对于set命令的帮助确切地包括本实施例中为延迟扩展:

  

最后,支持延迟   环境变量扩展具有   被添加。这种支持始终是   默认情况下禁用,但可能   启用经由/ V指令/禁止   行开关CMD.EXE。见CMD /?

     

延迟的环境变量扩展   对周围的越来越有用   当前膨胀限制   这发生在文本的行   阅读,而不是在执行它。该   下面的例子演示了   直接变量问题   扩展:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)
     

永远不会显示该消息,因为   在这两个IF语句中的%VAR%是   当第一IF取代   声明被读取,因为它在逻辑   包括IF,这是身体   复合语句。所以IF   里面的复合语句是   真的比较“之前”和“之后”   这将永远是平等的。同样的,   下面的例子将无法正常工作   预期:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
     

,它不会建了一个列表   在当前目录下的文件,但   而不是只会设置列表   变量的最后一个文件中。   再次,这是因为%LIST%是   扩大只是一次当FOR   声明被读取,而当时   List变量是空的。所以   实际FOR我们正在执行循环是:

for %i in (*) do set LIST= %i
     这只是不断设定LIST到

  最后文件中找到。

     

延迟的环境变量扩展   允许您使用不同的   字符(感叹号)至   扩大环境变量在   执行时间处理时间。如果延迟变量   扩充被启用,上述   例子可以写成如下   按预期方式工作:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

其他提示

您可以用 FOR / F命令完成后是什么。

下面是我多次使用一个很好的资源:

http://www.robvanderwoude.com/batchfiles.php

一本好书:Windows NT的Shell脚本由蒂姆·希尔。该版本我已经出版于1998年,但它仍然是有效的Windows命令程序在Windows 2008。

type *commonfilepart* >> concat_result_file

OS:WINDOWS SERVER 2003

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top