使用批处理(窗口)从文件名中提取数字

时间:2016-11-14 08:17:19

标签: batch-file windows-scripting

我不知道关于批处理脚本的任何,但我必须完成一项任务。 在档案中

123abc.txt
456def.txt
789ggg.txt

我必须从文件名中提取初始数字部分,并仅在数字高于给定基数时处理文件。

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的值总是随机的,它似乎总是设置为它找到的第一个值。

有人可以帮我示例吗?

非常感谢。

3 个答案:

答案 0 :(得分:0)

查看delayed expansion

每当您更改闭合的括号内的变量值时,您必须

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

需要延迟,因为if语句的整个块是一次计算的 - >在没有延迟扩张的情况下改变一个值将不会被视为之前计算过的 如果延迟扩展,你告诉程序,它必须在到达那里时再次计算这个部分。

虽然你对批处理脚本没有任何了解,但我相信你能做到!想一想您的程序必须遵循的逻辑,然后搜索如何批量实现它的每个部分。

答案 1 :(得分:0)

除了geisterfurz007之外,还有一个问题是你不能简单地 SSLContextBuilder sslcontext = new SSLContextBuilder(); sslcontext.loadTrustMaterial(null, new TrustSelfSignedStrategy()); httpclient = HttpAsyncClients.custom().setSSLContext(sslcontext.build()).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build(); 包含字母的var到另一个var中。如果该行始终以数字开头,则可以将所有字母作为分隔符,从而将其剪掉。而不是使用延迟扩展你可以使用伪调用,但必须加倍百分号。

set /a
Output
The number part is: 123
The number part is: 456
The number part is: 789

修改或者更好地执行

(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
)

答案 2 :(得分:0)

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"
)
可悲的是,有一些重要的事情你还没有告诉我们。这些文件的具体形式是3digits-three-letters.txt吗? vers的长度是否始终与前导数字字符串的长度相同?

如果是这样,以上内容利用了ASCII顺序 - 第一个字母必须是< A和> '0'(只允许数字),所以我们检测到一个数字领导者。如果具有数字前导的所有文件具有相同的长度前导,则ASCII顺序就足够了。

但是 - 这只是猜测。需要有关文件和vers

的更多信息