我看过了几篇答案,但是据我所知,这些答案并不是从Windows的角度来写的。
在文本文件中,Windows使用CR LF,Unix使用LF,Mac也使用LF,而经典的Mac则使用其他方式。如果一个文件使用与我正在输入的换行符不同的换行符,我就无法判断,因此在尝试运行脚本/程序时会出现错误,这些错误实际上并没有多大意义。将其转换后,脚本可以正常运行。
有没有办法在Windows上预先检查文件使用的换行符?
我看过了几篇答案,但是据我所知,这些答案并不是从Windows的角度来写的。
在文本文件中,Windows使用CR LF,Unix使用LF,Mac也使用LF,而经典的Mac则使用其他方式。如果一个文件使用与我正在输入的换行符不同的换行符,我就无法判断,因此在尝试运行脚本/程序时会出现错误,这些错误实际上并没有多大意义。将其转换后,脚本可以正常运行。
有没有办法在Windows上预先检查文件使用的换行符?
binaries
和dependencies
压缩文件:
http://gnuwin32.sourceforge.net/packages/file.htmc:\gnuwin32
下。然后你就可以执行:
c:\gnuwin32\bin\file.exe my-lf-file.txt
my-lf-file.txt; ASCII text
c:\gnuwin32\bin\file.exe my-crlf-file.txt
my-crlf-file.txt; ASCII文本,带有CRLF行终止符
当然您可以将c:\gnuwin32\bin
添加到%PATH%
变量中,以便无需提供完整路径即可访问它。
更新:
如果您已安装git
,则可以启动git-bash
并从那里运行file
命令。
或者您可以安装此子系统,如官方Microsoft文档所述,然后获得对file
命令的访问。
(Get-Content '\\FILESERVER0001\Fshares\NETwork Shares\20181206179900.TXT' -Raw) -match "\r\n$"
因此,对于现代软件上工作的计算机程序员来说,最重要的一点是要记住,任何CR和LF的组合,都需要被视为换行符。你几乎不会看到“旧”的Mac,即只有CR而没有LF - 我更喜欢忽略它相对微小的存在。我倾向于使用1字节文件处理,但这是个人偏好(在这种情况下,这种偏好会带来回报)。通过使您的代码能够适应文本文件的行结束格式,展示自己作为程序员的熟练程度。
rem check-crlf.bat
@echo off
setlocal
call type "%~1" | c:\Windows\System32\find.exe "" /v > "%~1.temp"
set size1=%~z1
rem add 2 in case the file doesn't have a trailing newline, since find will add it
set /a size1plus2=%size1%+2
call :setsize2 "%~1.temp%"
for /f %%a in ('c:\Windows\System32\findstr /R /N "^" "%~1" ^| c:\Windows\System32\find /C ":"') do set lines=%%a
if %size1plus2% equ %size2% (
if %lines% equ 2 (
echo File uses LF line endings!
) else (
echo File uses CRLF or has no line endings!
)
) else (
if %size1% lss %size2% (
echo File uses LF line endings!
) else (
echo File uses CR+LF line endings!
)
)
del "%~1.temp"
exit /b
:setsize2
set size2=%~z1
exit /b
我们正在处理没有尾随换行符的文件的特殊情况,以及具有两个以LF结尾的换行符的文件,这两种情况都会导致增加2个字节。
用法:
check-crlf.bat file-i-care-about.txt
0x0D
和0x0A
的字符。它们以此顺序组成了Windows换行符。 - Ken White