Loops 使用in循环对批处理中的字符进行计数
我尝试在文件名超过16个字符的目录(带有子目录)中获取(回显)文件。因此,我使用以下脚本:Loops 使用in循环对批处理中的字符进行计数,loops,batch-file,count,Loops,Batch File,Count,我尝试在文件名超过16个字符的目录(带有子目录)中获取(回显)文件。因此,我使用以下脚本: @ECHO OFF setlocal enabledelayedexpansion for /R %%f in (*) do ( set /p val=<%%f REM echo "fullname: %%f" REM echo "path: %%~pf" REM echo "name: %%~nxf" REM set test=%%~nxf REM echo %test%
@ECHO OFF
setlocal enabledelayedexpansion
for /R %%f in (*) do (
set /p val=<%%f
REM echo "fullname: %%f"
REM echo "path: %%~pf"
REM echo "name: %%~nxf"
REM set test=%%~nxf
REM echo %test%
if "%%~nxf:~16%" == "" echo "Less than 16 characters."
if not "%%~nxf:~16%" == "" echo "Bigger than 16 characters."
)
pause
GOTO :EOF
@ECHO关闭
延迟扩展
对于(*)中的/R%%f,请执行以下操作(
set/p val=您没有使用先前启用的delayedexpansion
,也不能对元变量使用替换或定位,您需要先将其分配给变量:
@echo off & setlocal enabledelayedexpansion
for %%i in (*) do (
set "line=%%~nxi"
if "!line:~16!"=="" (
echo !line! is less than 16 characters.
) else echo !line! is 16 or more characters.
)
通过运行以下命令查看帮助cmd
:
set /?
向下滚动到延迟环境部分。您真正的问题是我试图在文件名超过16个字符的目录(带有子目录)中获取(回显)文件。
dir/s/b??????*
不起作用,因为通配符?
表示零或一个字符
很高兴地其中
以不同的方式处理通配符:?
正好是一个字符
,*
是任意数量的字符(包括零)
因此,下面一行应该完全按照您的要求执行:显示名称加扩展名(根据您的代码尝试%~nxf
)为16个字符或更多的所有文件:
where /r . ????????????????*
where /r . ????????????????*.*
要获取名称不带扩展名为16个字符或更多的所有文件,请执行以下操作:
where /r . ????????????????*
where /r . ????????????????*.*
(可能会出现误报,如file.with.multive.extensions.txt
或file无扩展名
——其中false
取决于您的期望)