Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Windows 如何制作只显示文本文件最后一行的批处理脚本?_Windows_Batch File - Fatal编程技术网

Windows 如何制作只显示文本文件最后一行的批处理脚本?

Windows 如何制作只显示文本文件最后一行的批处理脚本?,windows,batch-file,Windows,Batch File,这个问题以前可能已经得到了回答,但我找不到关于这个话题的任何东西。我正在尝试批量制作聊天信使,为此我需要显示文本文件的最后一行。以下是我尝试过的(不是很优雅): 这可能行得通,但我认为它充满了错误,例如语法错误^^^,所以我只是想得到一些错误提示:)这里有一个(不需要外部工具)可以显示一系列编号的行 要显示最后一行,请按如下方式使用: call tailHead.bat -file=address.txt -end=1 这里有一个(不需要外部工具)可以显示一系列编号的行 要显示最后一行,请按如

这个问题以前可能已经得到了回答,但我找不到关于这个话题的任何东西。我正在尝试批量制作聊天信使,为此我需要显示文本文件的最后一行。以下是我尝试过的(不是很优雅):

这可能行得通,但我认为它充满了错误,例如语法错误^^^,所以我只是想得到一些错误提示:)

这里有一个(不需要外部工具)可以显示一系列编号的行

要显示最后一行,请按如下方式使用:

call tailHead.bat -file=address.txt -end=1
这里有一个(不需要外部工具)可以显示一系列编号的行

要显示最后一行,请按如下方式使用:

call tailHead.bat -file=address.txt -end=1
您可以使用my创建尾部命令。BAT是纯脚本(混合JScript/batch),从XP开始在任何Windows机器上本机运行

下面的命令将显示chat.txt中的最后一行

call jrepl "^.*" "" /match /inc -1 /f chat.txt
但是有一种更好的方法来开发批处理聊天程序(假设这是一个值得实现的目标)

您可以在一个循环中有一个批处理过程,将输入重定向到循环外部,循环将在新添加的行出现时读取和写入它们。您可以使用SET/P和ECHO,但使用单个FINDSTR更简单。这是因为FINDSTR在调用时不会重置文件指针,如中所述

您应该使用一些命令暂时暂停显示循环内的处理,以防止循环消耗100%的CPU内核。您可以使用TIMEOUT或PING hack,但它们会引入约1秒的延迟。我选择使用路径设置来引入~0.2秒的延迟

另外,如果两个进程同时写入同一个文本文件,您必须担心防止冲突。这可以通过使用锁文件来解决,如中所述

下面是一个基本的批处理聊天程序的开始。它的工作原理是让两个或多个用户各自导航到同一共享目录,然后运行
chat.bat sessionName
,其中sessionName是共享聊天文件的约定名称。每个用户将在其主控制台窗口中显示共享聊天对话框,并将打开一个新的控制台窗口,在该窗口中,他们可以写入对会话的贡献。输入
:退出
退出聊天程序

@echo off
setlocal disableDelayedExpansion
if "%~1" equ ":input" goto :startInput
if "%~1" equ ":display" goto :display
set "base=%~1"
set "dialog=%base%.chat"
set "quitfile=%base%_%username%.chat.quit"
start "" "%~f0" :input
del "%quitfile%" 2>nul
cmd /c "%~f0" :display
del "%quitfile%" 2>nul
exit /b


:display
title Chat Dialog
set "quit="
if not exist "%dialog%" (call ) >>"%dialog%"

<"%dialog%" (  for /l %%N in () do (
  if exist "%quitfile%" set "quit=1"
  findstr "^"
  if defined quit exit
  pathping -p 150 -q 2 localhost >nul
))

:startInput
setlocal enableDelayedExpansion
title Chat Input
call :write ">>> %username% has joined the conversation"
:input
cls
set "text="
set /p "text=>"
if /i !text! equ :quit (
  call :write "<<< %username% has left the conversation"
  copy nul "!quitfile!"
  exit
)
call :write
goto :input


:write
if "%~1" neq "" (set "text=%~1") else (set "text=%username%: !text!")
2>nul (
  >>"!dialog!" (
    echo(!text!
    (call )
  ) || goto :write
)
exit /b
@echo关闭
setlocal disableDelayedExpansion
如果“%~1”equ:input“goto:startInput
如果“%~1”相等:显示“转到:显示”
设置“基=%~1”
设置“对话框=%base%.chat”
设置“quitfile=%base%\uu%username%.chat.quit”
启动“”“%~f0”:输入
删除“%quitfile%”2>nul
cmd/c“%~f0”:显示
删除“%quitfile%”2>nul
退出/b
:显示
标题聊天对话框
设置“退出=”
如果不存在“%dialog%”(调用)>>“%dialog%”
努尔
))
:startInput
setlocal enableDelayedExpansion
标题聊天输入
呼叫:写入“>>>%username%已加入对话”
:输入
cls
设置“text=”
设置/p“文本=>”
如果/我!文本equ:退出(
call:write“您可以使用my创建tail命令。JREPL.BAT是纯脚本(混合JScript/batch),从XP开始在任何Windows机器上本机运行

下面的命令将显示chat.txt中的最后一行

call jrepl "^.*" "" /match /inc -1 /f chat.txt
但是有一种更好的方法来开发批处理聊天程序(假设这是一个值得实现的目标)

您可以在循环中有一个批处理过程,将输入重定向到循环外部,循环将在新添加的行出现时读取和写入。您可以使用SET/p和ECHO,但使用单个FINDSTR更简单。这是因为FINDSTR在调用时不会重置文件指针,如中所述

您应该使用一些命令暂时暂停显示循环内的处理,以防止循环消耗100%的CPU内核。您可以使用TIMEOUT或PING hack,但它们会引入~1秒的延迟。我选择使用PATHPING来引入~0.2秒的延迟

另外,如果两个进程同时写入同一个文本文件,您必须担心防止冲突。这可以通过使用锁定文件来解决,如中所述

下面是一个基本的批处理聊天程序的开头。它的工作原理是让两个或多个用户各自导航到同一个共享目录,然后运行
chat.bat sessionName
,其中sessionName是共享聊天文件的商定名称。每个用户都将在其主控制台窗口中显示共享聊天对话框,并显示一个新的控制台窗口将打开,他们可以在其中写入他们对对话的贡献。输入
:quit
退出聊天程序

@echo off
setlocal disableDelayedExpansion
if "%~1" equ ":input" goto :startInput
if "%~1" equ ":display" goto :display
set "base=%~1"
set "dialog=%base%.chat"
set "quitfile=%base%_%username%.chat.quit"
start "" "%~f0" :input
del "%quitfile%" 2>nul
cmd /c "%~f0" :display
del "%quitfile%" 2>nul
exit /b


:display
title Chat Dialog
set "quit="
if not exist "%dialog%" (call ) >>"%dialog%"

<"%dialog%" (  for /l %%N in () do (
  if exist "%quitfile%" set "quit=1"
  findstr "^"
  if defined quit exit
  pathping -p 150 -q 2 localhost >nul
))

:startInput
setlocal enableDelayedExpansion
title Chat Input
call :write ">>> %username% has joined the conversation"
:input
cls
set "text="
set /p "text=>"
if /i !text! equ :quit (
  call :write "<<< %username% has left the conversation"
  copy nul "!quitfile!"
  exit
)
call :write
goto :input


:write
if "%~1" neq "" (set "text=%~1") else (set "text=%username%: !text!")
2>nul (
  >>"!dialog!" (
    echo(!text!
    (call )
  ) || goto :write
)
exit /b
@echo关闭
setlocal disableDelayedExpansion
如果“%~1”equ:input“goto:startInput
如果“%~1”相等:显示“转到:显示”
设置“基=%~1”
设置“对话框=%base%.chat”
设置“quitfile=%base%\uu%username%.chat.quit”
启动“”“%~f0”:输入
删除“%quitfile%”2>nul
cmd/c“%~f0”:显示
删除“%quitfile%”2>nul
退出/b
:显示
标题聊天对话框
设置“退出=”
如果不存在“%dialog%”(调用)>>“%dialog%”
努尔
))
:startInput
setlocal enableDelayedExpansion
标题聊天输入
呼叫:写入“>>>%username%已加入对话”
:输入
cls
设置“text=”
设置/p“文本=>”
if/i!text!eq:退出(
电话:写“