2

最近、バッチファイルの作成方法を学び始めました。インターネット関連のログ ファイルの束を含むフォルダーがあります。.cmd ファイル (同じフォルダーにある) を実行すると、フォルダー内にあるログ ファイルの数を確認し、そこから番号付きのメニューを作成できるようにしたいと考えています。フォルダに 20 個のファイルがあるとします。ユーザーは 1 から 21 までを選択できる必要があります。21 はバッチ ファイルを閉じます。これが私がこれまでに行ったことです:

@echo off
setlocal enableextensions enabledelayedexpansion
set RawData1=TempData%random%.tmp
set FileCtr=0    

:MAIN
dir *.log /b | findstr /i /n ".log" > %RawData1%

for /f "tokens=1 delims=:" %%a in (%RawData1%) do set FileCtr=%%a
set /a ExitCode=%FileCtr% + 1
set UserChoice=%ExitCode%

echo.
echo +++++++++++++++++++++++++++
echo     Weblog File Viewer                              
echo +++++++++++++++++++++++++++    
for /f "tokens=1-2 delims=:." %%a in (%RawData1%) do echo %%a. %%b
echo %Exitcode%. To Quit.
set /p UserChoice= Choose item number from menu (%UserChoice%):    

echo\
echo user entered: %UserChoice%
pause
:THEEND
del /q %RawData1%

このバッチ ファイルで今できることは、ログ ファイルの数を計算し、そこから番号付きのメニューを作成することです。もちろん、私が望んでいたファイルタイプは表示されません。したがって、たとえば「Kelley-Blue-Book.log」は「Kelley-Blue-Book」としてのみ表示されます。ただし、ユーザーがリストから番号 4 を選択すると、メモ帳を使用して目的のログ ファイルを実際に開く方法がわからなかったため、プログラムは終了します。

4

2 に答える 2

2

これはあなたが望むことをするはずです:

@echo Off
setlocal EnableDelayedExpansion
set "Count=0"
pushd "%~dp0"

echo.
echo +++++++++++++++++++++++++++
echo     Weblog File Viewer                              
echo +++++++++++++++++++++++++++  
for %%A in (*.log) do (
    set /a "Count+=1"
    set "Menu[!Count!]=%%~fA"
    set "Number=   !Count!"
    echo !Number:~-3!. %%~nA
)
set /a "Count+=1"
set "Number=   %Count%"
echo %Number:~-3%. To Quit.

:Prompt
set "UserChoice="
set /p "UserChoice= Choose item number from menu (%Count%):"
if not defined UserChoice goto Prompt
set "UserChoice=%UserChoice:"=%"

if "%UserChoice%"=="%Count%" goto Done
for /f "tokens=1,* delims==" %%A in ('set Menu') do (
    if /i "Menu[%UserChoice%]"=="%%~A" (
        notepad "%%~fB"
        set "UserChoice="
    )
)
if defined UserChoice echo Invalid Choice.
goto Prompt

:Done
popd
endlocal
exit /b 0

説明が必要な場合はお知らせください。

于 2013-10-18T16:28:00.423 に答える
1
@echo off
    setlocal enableextensions 

    set RawData1=TempData%random%.tmp

    rem Get numbered list of files
    dir /b "*.log" | findstr /i /n ".log" > %RawData1%

    rem We could use 0 as exitCode, 
    rem but to keep original behaviour
    rem lets count the number of files
    for /F "tokens=*" %%f in ('type %RawData1% ^| find /c /v "" ') do set /A ExitCode=%%f + 1

    if %ExitCode%==0 (
        echo No log files
        goto endProcess
    )

    rem show menu
    for /f "tokens=1-2 delims=:." %%a in (%RawData1%) do echo %%a. %%b
    echo %Exitcode%. To Quit.
    set UserChoice=%ExitCode%
    set /p UserChoice= Choose item number from menu (%UserChoice%):

    if "%UserChoice%"=="" goto :EOF
    if "%UserChoice%"=="%ExitCode%" goto endProcess

    rem Search indicated file in list
    set SelectedFile=
    for /f "tokens=2 delims=:" %%f in ('findstr /B "%UserChoice%:" %RawData1%') do set SelectedFile=%%f

    if "%SelectedFile%"=="" (
        echo Incorrect selection
        goto endProcess
    )

    if not exist %SelectedFile% (
        echo File deleted
        goto endProcess
    )

    notepad %SelectedFile%

:endProcess

    del /q %RawData1%
于 2013-10-18T16:34:49.150 に答える