Batch file 批处理文件如何筛选文件名以特定字符开头

Batch file 批处理文件如何筛选文件名以特定字符开头,batch-file,Batch File,如果文件名以ABC0开头,我想复制一个文件…(长度不固定), 但我使用下面的代码,它复制甚至我的文件名像ABCUnit001意味着开始与ABCU setlocal enabledelayedexpansion for %%x in (*.txt) do ( set filename=%%~nx if not "!filename=:~0,4!"=="ABC0" ( copy "%%x" "destination path" move "%%x" "Destinati

如果文件名以ABC0开头,我想复制一个文件…(长度不固定), 但我使用下面的代码,它复制甚至我的文件名像ABCUnit001意味着开始与ABCU

setlocal enabledelayedexpansion
for %%x in (*.txt) do (
set filename=%%~nx


    if not "!filename=:~0,4!"=="ABC0" ( 
    copy "%%x" "destination path"
    move "%%x" "Destination path"
    )

)

有人能帮忙吗?感谢并感谢

根据您的需要调整此代码,特别是硬编码的TargetPath

@for %%x in (*.txt) do @call :MoveIt %%x
@exit /b 0

:MoveIt
@set filename=%1
@set filename=%filename:~0,4%
@if /i "%filename%" == "ABC0" @move "%1" "TargetPath"
@exit /b
要诊断原始代码,请尝试以下操作:

@setlocal ENABLEDELAYEDEXPANSION
@set prompt=$G
@for %%x in (*.txt) do @(
    @set filename=%%~nx
    @echo filename==%filename%
    @echo %%~nx
    @echo %%x
)

我认为%%~nx没有达到您预期的效果,%filename%是空的。%%~nx是没有扩展名的文件名。不确定是否可以在if语句中使用类似的范围表示法。我只见过它与set命令一起使用/工作,这是我所知道的唯一有文档记录的用法。我总是通过将代码转换为子例程调用来避免嵌入多行块。

复制abc0*“设计路径”有什么问题?嗨,Magoo,如果将文件名以abc0开头的文件复制到目标路径,这没有错。但我的问题是,我的文件名是ABCUnit001,意思是从ABCU开始。它还复制到目标路径。默认情况下,每个文件都有两个名称-您正在使用的“长名称”和一个“短名称”,以使其与旧的DOS命名系统兼容。如果使用
dir/X*.txt
,则可以同时看到这两种格式。针对您当前的问题,为了使用
!瓦尔构造,您需要在
for
命令的
前面插入
setlocal enabledelayedexpansion
作为行。如果要复制以
ABC0
开头的文件,为什么要在
IF
命令中使用
NOT
选项?如果要“复制文件,如果文件名以ABC0开头”,那么
如果不是"!filename=:~0,4!“==”ABC0“
是错误的,如果“!文件名:~0,4!“==”ABC0“
这很好用。但是我可以知道为什么我不能使用上面的代码吗?在我删除“Not”后,它仍然不起作用。。