- 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" 的功能,加上管道,很好的比较两个字符串的大小。 |