标题: [文本处理] [分享]批处理命令sort不读写文件,按字节比较字符串 [打印本页]
作者: tiandyoin 时间: 2023-8-31 21:24 标题: [分享]批处理命令sort不读写文件,按字节比较字符串
- rem csort.bat
-
- @rem 文件后缀名必须是 .bat ,如果是 .cmd 或 .dos,可能造成返回的 errorLevel 和预期不一致。
-
- :main_20230829_224931
- @echo off&setlocal EnableDelayedExpansion
- @rem 10 0x0a <Line Feed> 换行符 调用方式: !$0a!
- set $0a=^
-
-
- @rem 10 0x0a <Line Feed> 使用 ANSI 编码时,以上必须空两行,必须延迟取值 !$0a!
- echo.
- REM set "arg1=;!a!%0%%~`@#$&,.-_+{}[]\*()=|:"^'<>?/"
- REM set "arg2=;C=Fc"="
- set arg1=&set /p arg1=arg1=
- set arg2=&set /p arg2=arg2=
- cd.
- call :YNC "比较时是否区分大小写?" N && (
- call :Strcmp arg1 arg2 "/c" && echo arg1 == arg2
- if !errorlevel! EQU -1 echo arg1 ^< arg2
- if !errorlevel! EQU 1 echo arg1 ^> arg2
- cd.&rem 如果不重置的 errorlevel 值,会触发 || 分支。
- ) || (
- if !errorlevel! EQU 3 (echo "用户中断后续流程。"&cd.&goto :EOF)
- call :Strcmp arg1 arg2 && echo arg1 == arg2
- if !errorlevel! EQU -1 echo arg1 ^< arg2
- if !errorlevel! EQU 1 echo arg1 ^> arg2
- cd.
- )
-
- call :Strcmp arg1 "arg2" && echo arg1 == "arg2"
- if !errorlevel! EQU -1 echo arg1 ^< "arg2"
- if !errorlevel! EQU 1 echo arg1 ^> "arg2"
-
- echo.&pause
- @goto :EOF
-
-
- @rem Usage:
- rem 功能: 比较字符串。相等: errorLevel=0; 小于: errorLevel=-1; 大于: errorLevel=1;
- rem 按 C 语言环境比较,即对逐个字节按对应 ASCII 码值比较。默认不区分大小写。
- REM 传递参数用双引号括住,表示传递的是字面字符串,否则传递的是变量名。
- rem 兼容所有特殊字符,如果字符串只是单个双引号,需要赋值给变量,然后把变量名传递给 :strcmp。
- rem 而传递两个双引号,则表示传递空值。
- rem 比较不涉及读写文件,可以在内存中高效运行。
- :Strcmp <&s1, &s2, [,/c ...]>
- @echo off||Created by tiandyoin&title Strcmp s1 s2 (ignore case defaultly)
- @setlocal EnableDelayedExpansion
- set guid={D3B20598-09F8-4b22-8B47-BA7778B2C3F4}
- set "so=/L "C"" & if not "%~3"=="" set "so=!so! %~3 "
- if "%~1"=="%1" (set "s1=!%1!") else set "s1=%~1"
- if "%~2"=="%2" (set "s2=!%2!") else set "s2=%~2"
- echo.!so! | findstr /I /C:"/C">nul && (
- if "!s1!"=="!s2!" exit /b 0
- ) || (
- if /i "!s1!"=="!s2!" exit /b 0
- )
- set "!guid!=!s1!!$0a!!guid!=!s2!"
- for /f "delims=" %%a in ('set !guid! ^| sort !so!') do (
- set guid=
- setlocal DisableDelayedExpansion
- set "str=%%a"
- setlocal EnableDelayedExpansion
- if "!str:~39!"=="!s1!" (
- @exit /b -1
- ) else (
- @exit /b 1
- )
- endlocal
- endlocal
- )
- @goto :EOF
-
- :: ---------------------------------------------------------------------------------------------------------------------
-
- @rem Usage:
- rem 功能: 判断是否按要求执行命令
- :YNC <Prompts ,[Y|N|C]>
- @echo OFF
- set "$=%~2"&if not defined $ set $=Y
- choice /C YNC /T 5 /D %$% /M "%~1 是请按 Y,否请按 N,或者取消请按 C。(5秒后默认为 '%$%')"
- if %errorlevel%==1 goto :YES
- if %errorlevel%==2 goto :NO
- if %errorlevel%==3 goto :CANCEL
- @exit /b 1
- :YES
- @cd.&goto :EOF
- :NO
- @exit /b 2
- :CANCEL
- echo "取消选择。不做任何修改。"
- @exit /b 3
- @goto :EOF
复制代码
由于 if 的比较是根据本地语言习惯比较,并不直观。要按字符的ASCII码逐字节比较的,只能想新的办法。
这里利用了 sort /l "c" 的功能,加上管道,很好的比较两个字符串的大小。
作者: Five66 时间: 2023-9-1 00:59
代码完全看不懂,真不愧是强者的世界
作者: Nsqs 时间: 2023-9-1 05:58
字节排序?- @echo off
- powershell -noprofile -executionpolicy bypass "[char[]]([System.Text.Encoding]::Default.GetBytes('hello')|sort) -join ''"
- pause
复制代码
作者: buyiyang 时间: 2023-9-1 09:28
本帖最后由 buyiyang 于 2023-9-1 09:29 编辑
复制代码
这里的 /c 是什么意思?
sort好像没有 /c 参数,C区域设置是不分大小写的,为什么加了/c就能区分大小写排序了?复制代码
我试了一下 / 也能达到同样的效果。
另外,除了了sort参数列表有的之外,我分别拿26个字母做开关参数试了一下,都提示无效命令行开关,除了 /c 和 /u,使用 /u 会使输出成为Unicode。
作者: tiandyoin 时间: 2023-9-1 17:57
回复 4# buyiyang
/c 是区分大小写,应该是有效果的,我再试试
作者: tiandyoin 时间: 2023-9-1 18:00
回复 3# Nsqs
都用 Powershell , 直接跑 ps1 好了。win xp 用不了
作者: tiandyoin 时间: 2023-9-1 18:03
回复 3# Nsqs
只有一个 ’hello‘ ? 怎么排序多个串
作者: tiandyoin 时间: 2023-9-1 18:50
回复 4# buyiyang - set guid={D3B20598-09F8-4b22-8B47-BA7778B2C3F4}
- set s1=AbCdeFGHijklmnooppQs1
- set s2=ABCdeFGHIJKlmnooppQs2
- set s3=AbCdeFGHijklmNOOppQs3
- set s4=abCdefgHijklmnooppQs4
- set s5=AbcDEFGHIJKLMNooppQs5
- set s6=abCdeFghijklMNOOppQs6
- set s7=AbCdeFGHijklmnooppqs7
-
- set "!guid!=!s1!!$0a!!guid!=!s2!!$0a!!guid!=!s3!!$0a!!guid!=!s4!!$0a!!guid!=!s5!!$0a!!guid!=!s6!!$0a!!guid!=!s7!"
-
- set !guid! | sort /L "C" /C
-
复制代码
结果是有排序的:
{D3B20598-09F8-4b22-8B47-BA7778B2C3F4}=ABCdeFGHIJKlmnooppQs2
{D3B20598-09F8-4b22-8B47-BA7778B2C3F4}=AbCdeFGHijklmNOOppQs3
{D3B20598-09F8-4b22-8B47-BA7778B2C3F4}=AbCdeFGHijklmnooppQs1
{D3B20598-09F8-4b22-8B47-BA7778B2C3F4}=AbCdeFGHijklmnooppqs7
{D3B20598-09F8-4b22-8B47-BA7778B2C3F4}=AbcDEFGHIJKLMNooppQs5
{D3B20598-09F8-4b22-8B47-BA7778B2C3F4}=abCdeFghijklMNOOppQs6
{D3B20598-09F8-4b22-8B47-BA7778B2C3F4}=abCdefgHijklmnooppQs4
作者: buyiyang 时间: 2023-9-1 19:20
回复 5# tiandyoin
sort好像没有 /c 参数,C区域设置也不分大小写,为什么加了/c就能区分大小写排序了?
我是问 /c 开关为什么可以实现区分大小写,因为sort的参数列表和帮助文档都没有这个参数,而且空的开关 / 也能实现相同的功能
、
作者: tiandyoin 时间: 2023-9-8 09:02
回复 9# buyiyang
我用 Win11 , 你用什么版本
https://ss64.com/nt/sort.html
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |