2016-11-17 11 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。バッチコードを使用して

出力は

com.android.apps.xxxx.apkのcom.dianxinos.xxxx.apkある com.dianxinos.optimizer.xxxx.apkとなどを... dianxinos.xxxx.apk com.dianxinos.optimizer.xxxx.apk

私の予想出力されenter code here

825165.apk 965464.apkコム指定されたテキスト文字列が正確に(すなわちと一致した場合if !packages! == !virusDB!で.android.apps.xxxx.apk com.dianxinos.xxxx.apk com.dianxinos.optimizer.xxxx.apk

答えて

0

==比較が真の条件を指定しますワイルドカードとみなされる文字はありません)。

所望の出力心限られており、正規表現のための非標準findstrサポートに有する次findstr commandから来ることができました:echo !packages!| findstr /I "!virusDB!"

virusDBファイル内の文字列で*が特定の文字列の中で最も1 *がある任意の文字にワイルドカードを意味し、すべきであるとすると、次のスクリプトは文字列が有効なfindstr正規表現になることをことを修正の可能な方法を示してい(結果を見るためにecho "%virusDB%" =^> "%FindstrRegEx%"コマンドのコメントを外します。regex)。 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

関連する問題