【问题标题】:How to read file and find it in folders如何读取文件并在文件夹中找到它
【发布时间】:2017-12-27 08:49:27
【问题描述】:

我们需要在特定路径的文件夹中搜索文件。 .csv 文件包含文件名列表,我们希望在给定目录中找到这些文件。 如果 .csv 文件中提到的任何文件在搜索路径中丢失,则应该抛出错误消息。

我们尝试了以下脚本,但它不起作用:

set InputFile=C:\Users\336727\Desktop\arun\SearchMCSentry\inputs.csv
:start
for /f "tokens=*" %%A in ('type "%InputFile%"') do ( 
    set "Found=1" 
        for /R %%f in ("%%A") do ( 
    echo ---%%f and Found = %Found%
            if exist %%f  (
            set Found=2
    echo ====%%A and Found = %Found%
            pause
            )
    echo %%A and Found = %Found%
        )
    if %Found%==1 goto :error

    )
    :error
    echo File not found  

您能否帮助我们实现这一目标。

谢谢, 段落

【问题讨论】:

  • 请使用顶部栏中的工具搜索 SO delayed expansion。这应该可以解释为什么您对 found 价值的期望没有得到满足。你的for..%%A...的整个body都可以替换成if not exist "%%A" goto error,彻底解决flag问题。
  • “它不起作用” 不是问题陈述。请阅读How to Ask

标签: windows loops batch-file


【解决方案1】:

你掉进了delayedexpansion的陷阱。


什么是延迟扩展

在 DOS 上运行的旧批处理脚本中,变量在运行时被扩展(变成它的值)。这意味着,当处理器开始执行for 循环时,for 循环中的所有变量都会展开。

您的情况

变量%found% 之前没有设置(至少我能看到)。因此,当循环运行时,会发生以下情况:

if ==1 goto :error

如何解决

启用延迟扩展(让扩展发生在运行时,而不是短语时)。在循环之前添加这一行:

setlocal enableDelayedExpansion

并将%found% 更改为!found!,以便处理器了解在运行时扩展它的必要性。

【讨论】:

    【解决方案2】:

    替代方法 - CALL SET

    如果你不喜欢delayed expansion,可以使用call set来模拟效果。

    call set found=1
    call echo %%found%%
    

    这个call command 技巧适用于除forif 之外的所有命令。 CALL REM 只能部分工作。

    除非绝对必要,否则我建议使用delayed expansionCALL SET 比较慢。

    【讨论】:

      猜你喜欢
      • 2020-01-31
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多