Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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 Batch.txt阅读器_Batch File_Auto Update_Chatroom - Fatal编程技术网

Batch file Batch.txt阅读器

Batch file Batch.txt阅读器,batch-file,auto-update,chatroom,Batch File,Auto Update,Chatroom,所以,基本上我想要一个批处理文件来读取.txt。问题在于,每当有新行写入.txt时,批处理文件都需要更新 @echo off set "pc=%1" FOR /F "delims=:" %%A IN ('findstr /N .* "%pc%"') DO set "zeilen=%%A" type %pc% set /A zeilen1=%zeilen% :loop if not %zeilen% == %zeilen1% ( set "line=" set zeilen2=%zeilen%

所以,基本上我想要一个批处理文件来读取.txt。问题在于,每当有新行写入.txt时,批处理文件都需要更新

@echo off
set "pc=%1"
FOR /F "delims=:" %%A IN ('findstr /N .* "%pc%"') DO set "zeilen=%%A" 
type %pc%
set /A zeilen1=%zeilen%
:loop
if not %zeilen% == %zeilen1% (
set "line="
set zeilen2=%zeilen% - 1
for /f %%a in ('more/e +%zeilen2% ^< %pc%') do (
   if not defined line set "line=%%a"
)
 echo %line%   
 set /A zeilen+=1
)
FOR /F "delims=:" %%A IN ('findstr /N .* "%pc%"') DO set "zeilen1=%%A
goto loop
@echo关闭
设置“pc=%1”
对于('findstr/N.'%pc%')中的/F“delims=:”%%A,请设置“zeilen=%%A”
类型%pc%
设置/A zeilen1=%zeilen%
:循环
如果不是%zeilen%==%zeilen1%(
设置“行=”
设置zeilen2=%zeilen%1
对于('more/e+%zeilen2%^<%pc%')中的/f%%a,请执行以下操作(
如果未定义行,则设置“行=%%a”
)
回音%行%
设置/A zeilen+=1
)
对于('findstr/N.'%pc%')中的/F“delims=:”%%A,请设置“zeilen1=%%A
转到环路
我也不能使用type命令(第9-13行),因为我不想只刷新最后一行的整个.txt文件

我的英语很差

谢谢


要开始批处理,您需要执行以下操作
调用Batch.cmd txtname.txt

如果您不希望使用第三方选项并希望保持其纯批处理,这是非常可能的。从您的问题来看,听起来您希望阅读文本文件的最后一行,并在每次编辑文本文件时更新该文本。Fur此外,当需要使用该批处理文件时,可以调用该批处理文件

为此,我们可以在
for循环中使用
forfiles
来比较上次修改的日期。原因是如果我们使用文件属性EX:
ECHO last modified date:%%~ta
我们将不会将属性降到秒。因此,文件将只比较到分钟

现在,我们可以获取上次修改的属性,我们可以使用
IF
语句来查找文件何时获得新的时间戳。从那里,我们可以使用修改后的脚本,该脚本只读取文本文件的最后一行(可配置为
set/a LINES=LINES+1
LINES+1-Infin)

要调用此批处理文件,您需要使用
call ReadFile.bat txtname.txt

  • 调用-命令
  • ReadFile.bat-批处理脚本的名称
  • txtname.txt-要读取的文本文件的名称
下面是完整的脚本

ReadFile.bat

@ECHO OFF
@GOTO READ

:LOOP
Rem | Look for changes
FOR /f %%a in ('forfiles /M %1 /C "cmd /c echo @fdate-@ftime"') DO (set FileTimeCurrent=%%a)

IF "%FileTimeLoad%"=="%FileTimeCurrent%" (goto LOOP) else (goto READ)

:READ
cls

Rem | Get current date
FOR /f %%a in ('forfiles /M %1 /C "cmd /c echo @fdate-@ftime"') DO (set FileTimeLoad=%%a)

Rem | Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in (%1) do (
    set /a LINES=LINES+1
)

Rem | Print the last line
set /a LINES=LINES-1
more +%LINES% < %1

goto LOOP
@ECHO关闭
@去阅读
:循环
Rem |寻找变化
对于('forfiles/M%1/C“cmd/C echo@fdate-@ftime“')中的/f%%a,执行(设置FileTimeCurrent=%%a)
如果“%FileTimeLoad%”==“FileTimeCurrent%”(转到循环)其他(转到读取)
:读
cls
Rem |获取当前日期
对于('forfiles/M%1/C“cmd/C echo@fdate-@ftime“')中的/f%%a,执行(设置FileTimeLoad=%%a)
Rem |获取文件中的行数
设置行数=0
对于(%1)中的/f“delims==”%%I do(
设置/a行=行+1
)
Rem |打印最后一行
设置/a行=行-1
更多+%行%<%1
转到环路
有关任何命令的帮助,请执行以下操作:

  • 呼叫/
  • 集/
  • 对于/
  • 如果/
  • 等等

可以这样编写一个基本的tail命令。要感谢@dbenham在

@echo关闭
调用:循环nul
)
转到:循环

所以你基本上是在尝试批量版本的
tail-f
?你可以从@error获得
tail
命令,请看我在你接受的答案下面的评论。这段代码在计算行数和输出新更新的行方面都有一些缺陷。1)根据如果<代码> > /f>代码>命令,则跳过空白行。因此,计算文件中有多少行可能是错误的。您应该考虑使用<代码>查找< /C>命令,而不是使用<代码> /c>代码>选项。2)如果在文件更改之前,将多行写入文件,则只打印L。ast行。它不会看到文件中写入了两行、三行或多行。它可能会丢失新行。当然,随着文件越来越大,脚本将越来越慢,因为它必须读取整个文件以获得行数,然后跳过除最后一行之外的所有行。
@echo off
call :Loop <"tailme.txt"

exit

:Loop
set "line="
set /p "line="
if defined line (
  echo %line%
) else (
  pathping -q 1 -p 300 localhost >nul
)
goto :loop