【问题标题】:IF EXIST - Batch script to match caseIF EXIST - 匹配大小写的批处理脚本
【发布时间】:2019-10-10 11:24:52
【问题描述】:

我的要求是仅在大小写匹配搜索时检查文件是否存在于文件夹中。

我已经搜索了互联网,还有基本的命令提示符帮助指南。我没有准确的答案。但是,在 StackOverflow 帖子中:REF-Post 通过将 FileName 作为变量发送到批处理文件来提供解决方案。但是,我想通过不使用发送到批处理文件的任何变量来搜索文件。

@echo off 
dir /b /a-d "%~1"|find "%~1" >nul
if %errorlevel% == 0 (echo found) else (echo fail)

此代码采用 %~1 值,我想直接用路径替换 %~1!请帮忙解决

例如: 文件夹 C:\Files\ 中存在一个名为 testfile.txt 的文件 逻辑应该是这样的:

IF EXIST C:\Files\TESTFILE.txt (
  echo file of case exists
) else (
  echo file of this case does not exist
)

【问题讨论】:

  • 我很想知道原因,因为您不能在同一位置拥有 string.extsTrInG.ext。更有意义的是确保任何创建的文件都有特定的案例。
  • 考虑只有一个文件名为:TESTFILE.txt的情况,那么代码应该会识别出文件名与testfile.txt不同
  • if exist testfile.txt 会找到它,if exist TeStFiLe.TxT 也会找到它!因为正如我已经说过的,Windows 不允许 string.extsTrInG.ext 在同一目录中。
  • 我知道它会识别文本是否在任何情况下。但是,我的要求是检查具有特定案例的文件是否存在?
  • 我知道您的要求,我的问题是您解释原因,即确切的目的是什么,而不是任务。编写好的代码需要您对整体任务有清晰的了解。

标签: batch-file


【解决方案1】:

这是 Gerhard 使用 FINDSTR 的原始答案的更正形式:

dir "C:\files" /b /a-d | findstr /x /c:"TESTFILE.txt" && echo Found || echo Not found

需要/c:"string" 选项来强制进行文字解释(不是正则表达式),并允许名称中包含空格。需要/X 选项来强制完全匹配。您不想误匹配“the_TESTFILE.txt”。

以上可能是最直接的技术。

这也可以通过 FOR 语句来解决。如果%%F 包含现有文件的名称(不区分大小写),则%%~nxF 将扩展为磁盘上实际区分大小写的名称。
但是如果%%F 不存在,那么%%~nxF 将永远不会改变大小写。所以IF EXIST也必须使用。

必须仔细构造命令才能给出正确的结果。我的目标是拥有一个自包含结构,允许在最后使用&&||,根据文件是否存在有条件地采取行动。

pushd C:\files
(
  for %%F in ("TESTFILE.txt") do (
    if exist %%F if %%~F==%%~nxF popd & (call)
  ) && popd
) && echo NOT FOUND || echo FOUND

或单行

pushd C:\files&(for %%F in ("TESTFILE.txt") do (if exist %%F if %%~F==%%~nxF popd&(call))&&popd) && echo NOT FOUND || echo FOUND

注意逆逻辑。如果文件存在且大小写匹配,则 (call) 是括号内最后执行的命令,导致返回码非零。如果文件不存在或大小写不匹配,则popd 是括号内最后执行的命令,导致返回码为零。

【讨论】:

  • 是的,我会改变我的答案,因为你现在有我的正确版本,没用我再次添加相同的版本。
【解决方案2】:

使用首选大小写搜索文件:

@echo off
set "res=" && for /f "delims=" %%i in ('dir "C:\Files" /b /a-d') do if "%%i"=="TESTFILE.txt" set "res=%%i"
if defined res (echo %res% Found) else (echo File not found)

仍在使用for /f,但没有设置变量:

@echo off
for /f "delims=" %%i in ('dir "C:\files" /b /a-d') do if "%%i"=="TESTFILE.txt" echo File found & goto :eof
echo File not found

或者只是没有/f,但你需要

@echo off
for %%i in (C:\Files\*) do if "%%i"=="TESTFILE.txt" echo File found & goto :eof
echo File not found

【讨论】:

  • 我也在询问用于检查 TESTFILE.txt 的代码...该代码应该能够识别区分大小写的文件名
  • 是的。确切地。我想专门检查具有特定情况的文件。我该怎么做?
  • 不完全 - 这可能会根据文件的名称给出错误的结果。见my answer
  • @dbenham 好的,我已经改变了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
相关资源
最近更新 更多