【问题标题】:Check for changes in specifics files with batch not working as expected检查特定文件中的更改,批处理未按预期工作
【发布时间】:2017-11-16 22:36:17
【问题描述】:

我有不同的文件,我想使用批处理检查其中的任何更改。这就是我所拥有的:

@echo off
setlocal enableDelayedExpansion
set "list=test.txt test1.txt"

:loop
timeout -t 1 >nul
for %%j in (%list%) do (
    REM Here only prints test.txt       
    echo %%j
    for %%i in (%%j) do echo %%~ai|find "a">nul || goto :loop
    echo file was changed %%j
    attrib -a %%j
)
goto :loop

如果我只使用一个文件,则可以,但不能使用两个或更多。这个想法是,echo file was changed %%j 只输出正确的文件,而不是两者。

有什么想法吗?

编辑

如果我做一些改变:

@echo off
title LAN chat reader
setlocal enableDelayedExpansion
set "list=test.txt test1.txt"

:loop
timeout -t 1 >nul
for %%j in (%list%) do (
    echo %%j
    echo %%~aj|find "a">nul || goto :loop
    echo file was changed %%j
    attrib -a %%j
)
goto :loop

有效,但仅在我对第一个文件进行更改后提醒我第二个文件中的更改。我可以理解问题出在循环中,所以我很困惑。

【问题讨论】:

  • 一旦您跳出循环,您将无法处理其他文件。为什么找不到属性就跳出循环?
  • 只是为了测试,还是不行
  • 另外,您的 find 命令将始终为 false,因为您正在寻找小写字母 a。使用/I 开关和FIND 命令或大写字母。
  • 我建议几件事。 #1:使用 'call :CheckFile "%%j"' 而不是嵌套的 for 循环 - 使事情更容易阅读。 #2:您可以使用 DIR 更直接地检查属性: dir /aa %%j > nul 2>&1 && attrib -a %%j
  • 您甚至不需要第二个FOR 命令。你可以使用echo %%~aj|find "A">nul

标签: windows batch-file for-loop command-line cmd


【解决方案1】:

我建议几件事。

1:使用

call :CheckFile "%%j"

而不是嵌套的 for 循环 - 使事情更容易阅读。

2:您可以使用 DIR 更直接地检查属性:

dir /aa %%j > nul 2>&1 && attrib -a %%j

两者看起来像:

:loop
    timeout -t 1 >nul
    for %%j in (%list%) do call :CheckFile "%%j"
    goto :loop

:CheckFile
    echo %1
    dir /aa %1 > nul 2>&1 || goto :EOF
    echo file was changed %1
    attrib -a %1
    goto :EOF

【讨论】:

  • 是的,这正是我要找的。谢谢我的朋友!
猜你喜欢
  • 2020-12-17
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
相关资源
最近更新 更多