如何解决GitHub Action中Windows 8.3短路径与长路径对比不等问题
问题解决方法
你遇到的是Windows系统下8.3短文件名(如RUNNER~1)和长文件名(如runneradmin)的字符串格式差异问题,两个路径实际指向同一个位置,只需要将参与对比的路径统一转为同一种格式即可正常判断相等。
方案1:统一转短文件名对比
通过cmd的for命令扩展修饰符~s可以将任意路径转为短文件名格式,修改你的脚本对比逻辑:
:: 转换路径为统一短名格式 for %%i in ("%WORKON_HOME%\name with spaces") do set CHECK_PATH=%%~si for %%i in ("%VIRTUAL_ENV%") do set VENV_PATH=%%~si if "%CHECK_PATH%"=="%VENV_PATH%" ( echo workon home and virtualenv are equal ) else ( echo "%CHECK_PATH%" is not equal to "%VENV_PATH%" ) :: 第二个对比逻辑同理 for %%i in ("%CD%") do set CD_PATH=%%~si for %%i in ("%VIRTUAL_ENV%") do set VENV_PATH=%%~si if "%CD_PATH%"=="%VENV_PATH%" ( echo cd and virtualenv are equal ) else ( echo "%CD_PATH%" is not equal to "%VENV_PATH%" )
方案2:统一转长文件名对比
如果需要保留路径可读性,用修饰符~f将路径统一转为全路径长文件名格式即可,逻辑和上述一致:
for %%i in ("%WORKON_HOME%\name with spaces") do set CHECK_PATH=%%~fi for %%i in ("%VIRTUAL_ENV%") do set VENV_PATH=%%~fi :: 后续对比逻辑和方案1相同
源头规避方案(可选)
你可以在脚本最开头先将系统内置的TMP变量强制转为长路径格式,后续所有基于TMP生成的路径都会统一为长文件名,从根源避免短名问题:
@echo off :: 开头先修正TMP变量为长路径格式 for %%i in ("%TMP%") do set TMP=%%~fi :: 后续原有脚本逻辑不变 set "WORKON_HOME=%TMP%\wo home %RANDOM%" :: ......
内容的提问来源于stack exchange,提问作者thebjorn
相关产品推荐
相关产品推荐

