如何使用Windows命令从文本文件中读取最后53个字符?

时间:2014-06-12 19:46:56

标签: windows batch-file scripting text-processing

我没有任何脚本编写经验,但我被要求创建一个脚本,以自动从存储阵列控制器下载日志文件以进行日常存档。应有 对于存储供应商的CLI的限制,看起来最直接的方法是运行供应商的命令列出日志文件并将输出重定向到文本文件。

一旦文件名存储在文本文件中,我就想从文件中读取最新的文件名并使用它从数组中提取文件。日志文件的标准文件名格式为53个字符,但每天都会更改,因为创建日期和时间是文件名的一部分。文件名有点随机,因为创建时间并非每天都一致。

生成文件名列表非常简单,但我还没弄明白如何从文件中读取最后53个字符。

由于存储供应商语法的限制,我必须使用确切的文件名(这就是我尝试使用列表方法的原因)。

我不知道这是否重要,但我的文本文件末尾有一个空白行和我的文件名。如果我做错了,或者这是批处理文件创建的列表的标准结果,我不会随便知道。我不知道这是否会影响尝试读取文件名。

另一个潜在的复杂因素是我只能使用标准的Windows命令。我无法在管理服务器上安装任何第三方实用程序。

这是我运行命令列出文件时创建的输出文件中的示例:

  

469 1815 06/11/2014 13:30:44 SERIALNUMBER ## _ SC#_YYYY-MM-DD_HH-MM-SS-GMT_M05-00.log

任何建议将不胜感激。我花了相当多的时间研究,但到目前为止我发现的例子似乎是用于Unix或使用我无法使用的第三方工具。

感谢。 比尔

3 个答案:

答案 0 :(得分:0)

我最接近的是给你一个文件。
此bat文件将计算文件中的行,然后回显指示的行:

@setlocal enabledelayedexpansion
@set /a %count=0
@for /f "usebackq delims==" %%i in (`type %1`) do @(
    @set /a "count += 1"
)

REM countb = count from end of file back to the line you want
REM 0 == last line, 1 = line before last line, etc

@set /a %countb=1 
@for /f "usebackq delims==" %%i in (`type %1`) do @(
    @set /a "countb +=1"
    if !countb! == %count% @echo %%i
)

我发现一个类似的问题是关于计算bat文件中的单个字符,所以如果你真的需要从文件中获取特定数量的字符,可以看看这里:iterate over a string in a foor loop

答案 1 :(得分:0)

@echo off
setlocal
for /f "delims=" %%a in (thetextfilename) do set targetfile=%%a
echo %targetfile%

应显示文件名。您的样本中的一些行可能更容易理解您的问题。

默认情况下,for /f会忽略空行。 blank line对不同的人意味着不同的东西。文本文件以两个字符\ 0A \ 0D甚至\ 0A \ 0D \ 1A结尾是正常的。 \ 0A \ 0D \ 0A \ 0D意味着真正的空白(空)行;但是\ 0A \ 0D 空格 \ 0A \ 0D虽然看起来是空白但不是empty行。

答案 2 :(得分:0)

@echo off
    setlocal enableextensions

    for /f "usebackq tokens=5" %%a in ("file.txt") do set "lastFile=%%a"

    echo %lastFile%

这将读取输入文件,并且对于每一行,将使用空格/制表符作为分隔符将行拆分为标记。从生成的字段/标记列表中,检索第5个(文件名)并将其存储在变量中。当每个行重复该过程时,变量的最终内容将是文件最后一行中的文件名。

for /f不处理空行。如果该行不是真的空(它包含空格,换行符,制表符......),这应该不是问题。代码要求行中的第5个标记,因此,没有至少5个字段的行也将被丢弃。