尝试从日志文件中取出一行,删除一些文本,然后将其放入批处理脚本中的新文本文件中

尝试从日志文件中取出一行,删除一些文本,然后将其放入批处理脚本中的新文本文件中

我正在尝试从日志文件中取出最后一行,并从其开头和结尾删除一些文本,然后将其放入新的文本文件中。我的批处理经验很少,任何帮助都非常感谢。

最后一行:

Opening track for playback: "D:\Music\musicfile.m4a"

日志文件的路径:

%USERPROFILE%\Documents\file.log

我希望完成后最后一行看起来像这样:

musicfile

答案1

电源外壳:

详细:

$LogFile = "$env:%USERPROFILE%\Documents\file.log"
(Get-Content -Path $LogFile | Select -Last 1) -match '.+\\([\w\s]+)\.\w{3}"$' | out-null
$matches[1]

在控制台:

(gc "$HOME\Documents\file.log")[-1] -match '.+\\([\w\s]+)\.\w{3}"$'
$matches[1]

替代字符串操作:

$Line = (gc "$HOME\Documents\file.log")[-1]
$Line.split('"')[1].split('\')[-1].split('.')[0]

甚至一行:

(gc "$HOME\Documents\file.log")[-1].split('"')[1].split('\')[-1].split('.')[0]

获取内容

选择对象

关于正则表达式

答案2

Windows 10 64 位。PowerShell 5。

如何使用 Powershell 5 和正则表达式 (regex) 解析文件路径的文本文件并从全名中提取基本名称,然后将结果附加到以 ascii 编码的新文本文件中。

文件.log:

Opening track for playback: "D:\Music\musicfile1.m4a"
Opening track for playback: "D:\Music\musicfile2.mp3"
Opening track for playback: "D:\Music\musicfile3.wav" 
Opening track for playback: "D:\Music\musicfile4.mid" 
Opening track for playback: "D:\Music\musicfile5.MINIGSF"
Opening track for playback: "D:\Music\musicfile6.AIMPPL"
Opening track for playback: "D:\Music\musicfile7.L" 
Opening track for playback: "D:\Music\musicfile8.ACD-ZIP" 
Opening track for playback: "D:\Music\musicfile.m4a"

file.log 的路径:

$HOME\Documents\file.log

我想从最后一行提取的内容:

musicfile

长的:

(Get-Content -Path $HOME\Documents\file.log | Select -Last 1) -match '.+\\([\w\s]+).+'
$matches[1] | out-file $HOME\Documents\file2.log -append -encoding ascii

短的:

(gc "$HOME\Documents\file.log")[-1] -match '.+\\([\w\s]+).+'
$matches[1] | out-file $HOME\Documents\file2.log -append -encoding ascii

如何编写第一个 PowerShell 脚本

获取内容

选择对象

常用表达

Regex101.com

答案3

根据文件的大小(行数),建议一些更直接和更快的方法......

试试这个...

@echo off

setlocal enabledelayedexpansion & set "file=%USERPROFILE%\Documents\File.log"
for /f %%L in ('type "!file!" ^| find /v /c ""')do set /a "skip=%%~L-1" && (
for /f tokens^=4^delims^=^\.^" %%i in ('%__APPDIR__%more.com "!file!" +!skip!
')do echo\%%~i>"%USERPROFILE%\Documents\YourNew.log") && endlocal & goto :EOF
  • 或者,在正常布局中同样的代码:
@echo off

setlocal enabledelayedexpansion
set "file=%USERPROFILE%\Documents\File.log"

for /f %%L in ('type "!file!" ^| find /v /c ""')do set /a "skip=%%~L-1"
for /f tokens^=4^delims^=^\.^" %%i in ('%__APPDIR__%more.com "!file!" +!skip!
')do echo\%%~i>"%USERPROFILE%\Documents\YourNew.log"

endlocal & goto :EOF

1)使用for /fwithfind /v /c ""来计算文件中有多少行需要跳过,并将其保存在变量中 (!skip! - 1) -> 最后一行

for /f %%L in ('type "!file!" ^|find /v /c ""')do ( set /a "skip=%%~L-1" )

2)另外for /f使用多个分隔符(\.")和相应的转义符( )来从第 4 个标记中的^\.^"行输出子字符串中获取。\musicfile."

for /f tokens^=4^delims^=^\.^" %%i in (...

3)作为参数传递给命令more应跳过多少行,获取循环变量输出中的最后一行

'%__APPDIR__%more.com "!file!" +!skip!'

4)使您的变量/子字符串被回显并将此输出重定向到目标新文件。

...')do echo\%%~i>"%USERPROFILE%\Documents\YourNew.log"


相关内容