我正在尝试从日志文件中取出最后一行,并从其开头和结尾删除一些文本,然后将其放入新的文本文件中。我的批处理经验很少,任何帮助都非常感谢。
最后一行:
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
答案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 /f
withfind /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"