2016-09-30 7 views
2

バッチファイルを作成してすべての.vsdmファイルを検索し、ファイル名にサブストリング "2.4"を含める必要があります。しかし、私のコードでは、すべての.vsdmファイルに "2.4"という部分文字列が含まれていると言っていますが、これは正しくありません。私はそれが間違って手に入れたところサブストリングを含むファイル名を見つけるバッチファイル

FOR /R %completepath% %%G IN (*.vsdm) DO (
set file=%%~nG 

If not "%file%"=="%file:2.4=%" (
    echo Filename contains 2.4 
) else (
    echo Filename does NOT contains 2.4 
) 
) 

誰も教えてもらえますか?echoでファイル名を含むおかげ

+2

「For /?」と「setlocal /?」のdelayedexpansionを参照してください。そして、 'set /?'もそれについて議論します。基本的に '%file%'ではなく '!file!'を使用してください。 –

+3

'dir/a/s" c:\ * 2.4 * .vsdm "'はあなたが望むものをすばやく実行します。 –

+0

'forfiles'コマンドも参照してください。 (これはunixの 'find'のようなものです) – ths

答えて

0
If "%file%"=="%file:2.4=%" (
    echo Filename "%file%" does NOT contain 2.4 
) else (
    echo Filename "%file%" contains 2.4 
) 

をより多くを明らかにすることができます。私は二重否定的なアプローチの理由を見ることができません。コードがどのように動作するかは、コード内で命令がどの位置にあるかによって異なります。たとえば、これらの行がさまざまなループまたはコードブロックに含まれている場合、操作は他の要素に依存する可能性があります。予想されたことと実際に何が起きたかの例を示しています。


正しい説明がすべてクリアされます。

OPが熟知しているはずのdelayed expansionについての1〜2つのSOの記事があります。

SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /R %completepath% %%G IN (*.vsdm) DO (
set "file=%%~nG" 

If not "!file!"=="!file:2.4=!" (
    echo Filename contains 2.4 
) else (
    echo Filename does NOT contains 2.4 
) 
) 
ENDLOCAL 
+1

コードの最初の行(そして最後の行)はコードとしてフォーマットされていません。これは 'FOR'ループ内にあります。 –

0

あなたはコマンド使用すると、ワイルドカード文字(?*)とUNCパスを使用してみましょうWhere /?を使用することができます。

@echo off 
Title Find the location of a file with substring by Hackoo 
Color 0A 
Call :inputbox "Enter the file name to search :" "Enter the file name to search" 
If "%input%" == "" Color 0C & (
    echo(
    echo  You must enter a filename to continue with this program 
    pause>nul & exit 
) else (
    Call :Browse4Folder "Select the source folder to scan %input%" "c:\scripts" 
) 
Set "ROOT=%Location%" 
::We check whether the input string has an anti-Slach in the end or no ? if yes, we remove it ! 
IF %ROOT:~-1%==\ SET ROOT=%ROOT:~0,-1% 

set whereCmd=where.exe /r %ROOT% %input% 
for /f %%a in ('%whereCmd%') do echo %%~nxa --^> %%a 
pause & exit 
::*************************************************************************** 
:Browse4Folder 
set Location= 
set vbs="%temp%\_.vbs" 
set cmd="%temp%\_.cmd" 
for %%f in (%vbs% %cmd%) do if exist %%f del %%f 
for %%g in ("vbs cmd") do if defined %%g set %%g= 
(
    echo set shell=WScript.CreateObject("Shell.Application"^) 
    echo set f=shell.BrowseForFolder(0,"%~1",0,"%~2"^) 
    echo if typename(f^)="Nothing" Then 
    echo wscript.echo "set Location=Dialog Cancelled" 
    echo WScript.Quit(1^) 
    echo end if 
    echo set fs=f.Items(^):set fi=fs.Item(^) 
    echo p=fi.Path:wscript.echo "set Location=" ^& p 
)>%vbs% 
cscript //nologo %vbs% > %cmd% 
for /f "delims=" %%a in (%cmd%) do %%a 
for %%f in (%vbs% %cmd%) do if exist %%f del /f /q %%f 
for %%g in ("vbs cmd") do if defined %%g set %%g= 
goto :eof 
::*************************************************************************** 
:InputBox 
set "input=" 
set "heading=%~2" 
set "message=%~1" 
echo wscript.echo inputbox(WScript.Arguments(0),WScript.Arguments(1)) >"%temp%\input.vbs" 
for /f "tokens=* delims=" %%a in ('cscript //nologo "%temp%\input.vbs" "%message%" "%heading%"') do ( 
    set "input=%%a" 
) 
exit /b 
::*************************************************************************** 
関連する問題