2016-11-17 36 views
0

我的问题是如何在“virusDB”中使用通配符?如何在使用批处理命令的for循环中使用通配符

这里是我的批处理代码

setlocal enabledelayedexpansion 
for /F "tokens=*" %%A in (packages) do (
set packages=%%A 
for /F "tokens=*" %%A in (virusDB) do (
set virusDB=%%A 
if !packages! == !virusDB! echo !packages!>>virus.txt 
) 
) 
exit 

在我的 “套餐” 是

825165.apk 965464.apk com.android.apps.start2-1.apk融为一体。 dianxinos.dxbs-1.apk com.dianxinos.optimizer.duplay-1.apk

在我的 “virusDB” 是

1 * .apk 2 * .apk 3 * .apk 4 * .apk 5 * .apk 6 * .apk 7 * .apk 8 * .apk 9 * .apk com.android.apps.xxxx.apk com。 dianxinos.xxxx.apk com.dianxinos.optimizer.xxxx.apk等..

输出使用的批号是

com.android.apps.xxxx.apk com.dianxinos.xxxx.apk com.dianxinos.optimizer.xxxx.apk

我的预期输出是enter code here

825165.apk 965464.apk COM .android.apps.xxxx.apk com.dianxinos.xxxx.apk com.dianxinos.optimizer.xxxx.apk

回答

0

==if !packages! == !virusDB!比较指定真条件,如果指定的文本串匹配恰好(即没有人物被认为是通配符)。

所需的输出可以来自未来findstr command铭记对正则表达式限制和非标findstr支持:echo !packages!| findstr /I "!virusDB!"

假设*在里面virusDB文件中的字符串应该是指任何字符通配符没有在任何特定的字符串最多一个*,接下来的脚本显示修改字符串成为一个有效的findstr正则表达式的可能途径(取消echo "%virusDB%" =^> "%FindstrRegEx%"命令查看结果正则表达式)。说明在rem评论:

@ECHO OFF >NUL 
SETLOCAL EnableExtensions DisableDelayedExpansion 
rem change the current directory/folder and store the previous folder/path 
pushd "%~dp0" 

    rem ↓↓↓ debugging output ↓↓↓ 
echo(
echo === virusDB === 
type virusDB 
echo(
echo === packages === 
type packages 
echo(
echo === result (not redirected to "virus.txt" yet^) === 
    rem ↑↑↑ debugging output ↑↑↑ 

for /F "tokens=*" %%A in (virusDB) do (
    set "virusDB=%%A" 
    call :packages 
) 

rem change directory back to the path/folder most recently stored by the PUSHD command 
popd 
ENDLOCAL 
goto :eof 

:packages 
     rem escape Findstr regex wildcard dot to literal dot 
    set "FindstrRegEx=%virusDB:.=\.%" 
     rem change cmd wildcard * to Findstr regex wildcard .* 
     rem get suffix 
    set "FindstrRTail=%FindstrRegEx:**=%" 
    if "%FindstrRegEx%" == "%FindstrRTail%" goto :noAsterisk 
     rem get prefix 
    call set "FindstrRPrfx=%%FindstrRegEx:%FindstrRTail%=%%" 
     rem build regex 
    set "FindstrRegEx=%FindstrRPrfx:~,-1%.*%FindstrRTail% 
    :noAsterisk 
     rem ToDo: change cmd wildcard ? to appropriate Findstr regex wildcard 

     rem add Findstr regex line position anchor^ (??? and $ as well ???) 
    set "FindstrRegEx=^%FindstrRegEx%$" 
    rem debug output echo "%virusDB%" =^> "%FindstrRegEx%" 
     rem look for `regex` in "packages" file 
    for /F "delims=" %%G in ('findstr /I "%FindstrRegEx%" packages') do (
     echo %virusDB% =match= %%G 
) 
goto :eof 

不幸的是,上述方法将失败(即可能产生假阳性)如果virusDB文件的名称会包含空格。在案例中切换到PowerShell。

输出

==> D:\bat\SO\40654032\40654032.bat 

=== virusDB === 
1*.apk 
8*.apk 
9*.apk 
com.android.apps.*.apk 
com.dianxinos.xxxx.apk 
com.dianxinos.optimizer.xxxx.apk 

=== packages === 
825165.apk 
965464.apk 
com.android.apps.start2-1.apk 
com.dianxinos.dxbs-1.apk 
9com.dianxinos.optimizer.duplay-1.apk 

=== result (not redirected to "virus.txt" yet) === 
8*.apk =match= 825165.apk 
9*.apk =match= 965464.apk 
9*.apk =match= 9com.dianxinos.optimizer.duplay-1.apk 
com.android.apps.*.apk =match= com.android.apps.start2-1.apk 

==> 

资源(必读,不完全的):

+0

我认为您的权利先生,我需要切换到PowerShell的。我可以使用通配符,但我认为我需要在批处理脚本中手动输入virusDB中的所有名称,这是不切合实际的,或者创建批处理来创建另一个批处理,包括virusDB中的所有名称(纠正我,如果我错了),但无论如何,我想感谢你的所有努力先生帮助我。 – Drxtool

+0

我的荣幸。如果您发现它解决了您的问题,请考虑[接受答案](http://meta.stackoverflow.com/a/5235)。请问PowerShell解决方案的另一个问题(我会注意示例数据格式化)。 – JosefZ

相关问题