Batch file 使用批处理(windows)从文件名中提取数字

Batch file 使用批处理(windows)从文件名中提取数字,batch-file,windows-scripting,Batch File,Windows Scripting,我对批处理脚本一无所知,但我必须完成一项任务。 归档 我必须从文件名中提取初始数字部分,并且仅当数字高于给定的基数时才处理该文件 for /F "tokens=*" %%f in (%TEMP%\out.tmp) do ( set "var=%%f" & set /A "num=var" echo %num% rem if %num% GEQ %vers% do something ) num的值总是随机的,似乎总是设置为它找到的第一个值 有人能帮我举个例子吗

我对批处理脚本一无所知,但我必须完成一项任务。 归档 我必须从文件名中提取初始数字部分,并且仅当数字高于给定的基数时才处理该文件

for /F "tokens=*" %%f in (%TEMP%\out.tmp) do (
    set "var=%%f" & set /A "num=var"
    echo %num%
    rem if %num% GEQ %vers% do something
)
num的值总是随机的,似乎总是设置为它找到的第一个值

有人能帮我举个例子吗

非常感谢。

看一看

每当您在一个封闭的圆括号内更改一个变量的值时,您必须

1) 将
setlocal EnableDelayedExpansion
放在脚本开头(公共位置在
@echo off
行下方)和
2) 将
%num%
更改为
!嗯

需要延迟,因为if语句的整个块是一次性计算的->在没有延迟扩展的情况下更改内的值不会被视为以前计算的值。
对于延迟扩展,但是你告诉程序,当它到达那里时,它必须再次计算这个部分

即使你对批处理脚本一无所知,我相信你也能做到!想一想你的程序必须遵循的逻辑,然后搜索如何成批实现它的每个单独部分。

看看

每当您在一个封闭的圆括号内更改一个变量的值时,您必须

1) 将
setlocal EnableDelayedExpansion
放在脚本开头(公共位置在
@echo off
行下方)和
2) 将
%num%
更改为
!嗯

需要延迟,因为if语句的整个块是一次性计算的->在没有延迟扩展的情况下更改内的值不会被视为以前计算的值。
对于延迟扩展,但是你告诉程序,当它到达那里时,它必须再次计算这个部分


即使你对批处理脚本一无所知,我相信你也能做到!想一想你的程序必须遵循的逻辑,然后搜索如何成批实现它的每个单独部分。

除了geisterfurz007点之外,还有一个问题,你不能简单地
将/a
一个包含字母的变量设置为另一个变量。如果行总是以数字开头,你可以将所有字母作为分隔符就这样把他们切断了。而不是使用延迟扩展,您可以使用伪调用,但必须将百分比符号加倍

(Echo 123abc.txt
 Echo 456def.txt
 Echo 789ggg.txt
) >%TEMP%\out.tmp

Echo off 
for /F "delims=abcdefghijklmnopqrstuvwxyz" %%f in (%TEMP%\out.tmp) do (
    set "var=%%f"
    call set /A "num=%%var%%"
    call echo The number part is: %%num%%
    rem if %num% GEQ %vers% do something
)

除了geisterfurz007点之外,还有一个问题,即您不能简单地
将/a
包含字母的变量设置为另一个变量。如果行始终以数字开头,您可以将所有字母作为分隔符,从而将其截断。而不是使用延迟扩展,您可以使用伪调用,但必须将百分比符号加倍

(Echo 123abc.txt
 Echo 456def.txt
 Echo 789ggg.txt
) >%TEMP%\out.tmp

Echo off 
for /F "delims=abcdefghijklmnopqrstuvwxyz" %%f in (%TEMP%\out.tmp) do (
    set "var=%%f"
    call set /A "num=%%var%%"
    call echo The number part is: %%num%%
    rem if %num% GEQ %vers% do something
)
遗憾的是,有许多重要的事情你没有告诉我们。文件的格式是否为3digits-three-letters.txt?
vers
是否始终与前导数字字符串的长度相同

如果是这样的话,上面利用了ASCII顺序-第一个字母必须是“0”(只允许数字),因此我们检测到一个数字前导。如果所有具有数字引线的文件都具有相同长度的引线,则ASCII顺序就足够了

但是,这只是一个猜测。需要有关文件和版本的更多信息

遗憾的是,有许多重要的事情你没有告诉我们。文件的格式是否为3digits-three-letters.txt?
vers
是否始终与前导数字字符串的长度相同

如果是这样的话,上面利用了ASCII顺序-第一个字母必须是“0”(只允许数字),因此我们检测到一个数字前导。如果所有具有数字引线的文件都具有相同长度的引线,则ASCII顺序就足够了

但是,这只是一个猜测。需要有关文件和版本的更多信息

Output The number part is: 123 The number part is: 456 The number part is: 789
for /F "delims=abcdefghijklmnopqrstuvwxyz" %%f in (%TEMP%\out.tmp
  ) do if %%f GEQ %vers% do something
FOR /f "delims=" %%a IN (
 'dir /b /a-d "%sourcedir%\*.txt" '
 ) DO (
 IF /i "a" gtr "%%a" IF "%%a" geq "0" IF "%%a" gtr "%vers%" ECHO DO something with "%%a"
)