ラベル プログラム の投稿を表示しています。 すべての投稿を表示
ラベル プログラム の投稿を表示しています。 すべての投稿を表示

2023年10月13日金曜日

ELECOM VRG-M02RBK - VR Goggle and Movie Converter

VRゴーグル(ELECOM VRG-M02RBK) を購入しました。

製品の作りは、購入価格相応なので満足しています。


希望としては、大画面スマートフォン向けに

目幅調節範囲を、もっと拡大して欲しいです。

(ほぼ7インチそして7インチ超えスマートフォンで試しました)


この様な、スマートフォンを利用する簡易VRゴーグルは

低価格で多種な製品から選べますので、ハードウエアに困ることはありません。


しかし、視聴するコンテンツは入手に困ってしまいました。


こちらとしては、ガチのVRコンテンツを視聴したいのではなく

簡易3D動画(Side-by-Side 3D)を視聴したいのですが

それでも無料で入手できるのは、2分程度のショート動画しか見つけられません。


なので、3D動画を時間を費やして探すよりも

通常の2D動画を変換して3D動画にしてしまえと考えるに至りました。


結論としては、PCを使用した動画変換をしました。

参考にしたのはこの(askUbuntu_2d_to_3d_video_conversion)サイトです。


実際に使用したコマンドは、こうです

ffmpeg -ss 00:00:00.04 -i Conv_Test.mp4 -i Conv_Test.mp4 -filter_complex hstack out-sbs.mp4


変換は特にワーニングも出ずに終了し、スマートフォンで再生できました。


あとは、動画変換の数をこなしてみて

共有したい情報など見つかれば、報告したいと思います。

─以上─

2017年8月20日日曜日

VBS to send NumLock signal every ten minutes

Dim objResult

Set objShell = WScript.CreateObject("WScript.Shell")
i = 0

Do While i = 0
        objResult = objShell.sendkeys("{NUMLOCK}{NUMLOCK}")
        WScript.Sleep 1000*60*10
Loop
' -End of Source-

2017年8月12日土曜日

VBS to rename multiple files


Option Explicit

' +-------------------------------------------------------------------
' | Basically this statemants are Non-Sense.
' | The filename(s) is(are) passed Via FileDrop or Via [SendTo] context menu
' +-------------------------------------------------------------------
if WScript.Arguments.Count< 1 then
        WScript.echo("Please assign File(s), One or more")
        WScript.Quit(-1)
end if

' +-------------------------------------------------------------------
' | Specify the character(s) you want to rename
' +-------------------------------------------------------------------
Dim    Char_Before

Char_Before = InputBox("Enter character(s) you want to rename")

' +-------------------------------------------------------------------
' | Specifiy new character(s)
' +-------------------------------------------------------------------
Dim        Char_After

Char_After = InputBox("Enter New character(s)" & vbCrLf & "! If NONE, Means character(s) deletion")

Dim        objFSO
Dim        Char_FileName_Before
Dim        Char_FileName_After

Set obJFSO = CreateObject("Scripting.FileSystemObject")

' +-------------------------------------------------------------------
' | If processing filename does not include character(s) to be renamed,
' | Then skip rename process
' +-------------------------------------------------------------------
Dim        Cnt
Dim        ReplaceCounter: ReplaceCounter = 0

For Cnt=0 To WScript.Arguments.Count-1:Do
        Char_FileName_Before = objFSO.GetFileName(WScript.Arguments(Cnt))
        Char_FileName_After  = Replace( Char_FileName_Before, Char_Before, Char_After )

        if Char_FileName_After = Char_FileName_Before Then Exit Do

        objFSO.GetFile(WScript.Arguments(Cnt)).name = Char_FileName_After
        ReplaceCounter = ReplaceCounter +1
Loop Until 1:Next

' +-------------------------------------------------------------------

WScript.echo( ReplaceCounter & "_File(s) is(are) Renamed" )
Set objFSO = nothing

2016年11月27日日曜日

エクセル 備忘録 16/11/27

システム関連情報を取得する関数

フルパス&(拡張子付き)エクセルファイル名&(該当セルのある)シート名
=CELL( "filename",
             $A$1
            )

エクセルファイルの存在するフルパス
=LEFT( CELL( "filename", $A$1 ),
             FIND( "[", CELL( "filename", $A$1 ) )-1
           )

拡張子なしのエクセルファイル名
=REPLACE( LEFT( CELL( "filename", $A$1 ), FIND( ".", CELL( "filename", $A$1 ) ) -1 ),
                     1,
                     FIND( "[", CELL( "filename", $A$1 ) ),
                  )
※第4引数(置き換え文字)は無しです
※エクセルファイル拡張子文字数が、かつては3文字固定だったが
    4文字の場合もあるので、ファイル名に関わる文字列操作は処理開始文字位置に注意が必要

2016年5月8日日曜日

エクセル の セル表示内容 を, デスクトップ で 常時監視する しくみ

スケジュールや進捗をエクセルで管理しているとして、
そのエクセルブックに設定している、[期限状況まとめ]セルの表示内容を
(該当のエクセルブックを開かず)にデスクトップで監視していたい
……といった要求への、ひとつの案です。

制約条件として
1.「エクセルブックを開かず」というのは、使用者視点でのハナシです。
      実際には、非表示にてオープン,セーブ&クローズを行っています。

2.デスクトップで監視しているのは、監視対象となるセルの表示内容そのものではなく
    その表示内容を画像データに変換した結果を監視することになります。
   
3.上記2.で変換した画像データを、デスクトップで監視するには
     別途に表示のための仕組みが必要となります。
     実際の運用例としては、Win7のスライドショーガジェットを使ってます。



■VBS側■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
' ▲本スクリプトでは
' ▲環境変数を通じてエクセルマクロの動作を制御する手法を使っている。
' ▲ただし、VBSからエクセルの特定マクロを直接起動できるので
'   そちらの方が、i/fの単純化としては有利となる。
'   その辺は各自判断のこと。

' ---------------------------------------------------------
OptionExplicit                         ’変数に対して明示的な宣言をさせる

' ---------------------------------------------------------
' エクセル起動制御として、環境変数を利用する
    Dim    objShell
    Set    objShell = WScript.CreateObject("wscript.Shell")
    Dim    obJUserEnv
    Set    objUserEnv = ObjShell.Environment("PROCESS")
           ' フラグに1を設定することで、
           ' エクセル側ではスケジュール起動されたものと判断します
           objUserEnv.Item("envFlg_ExcelOpen_AutoMode") = "1"

' ---------------------------------------------------------
' エクセルを起動する
' エクセルはマクロ内でフラグ(環境変数)を評価することで
' スケジュール起動されたのか、人手による起動なのかを判定する
    Dim    obJExcel
    Set    objExcel = CreateObject("Excel.Appiication")
    objExcel.Visibie = False

    On Error Resume Next
    objExcel.Workbooks.Open "\\serverX\Pub\- - -\Docs\期限管理.xls"

    If Err.Number > 0 Then
        MsgBox "ファイルを開けません。名前変えてませんか?場所変えてませんか?"
    End If
   
    On Error Goto 0

' ---------------------------------------------------------
    Wscript.sleep(300)                  ' Wait 3-Sec

    objExcel.DisplayAlerts = False
    ' objExcel.Workbooks.Save           ' エクセル側でクローズ時に自動セーブさせるなら不要
    objExcel.Workbooks.Close

    objExcel.DisplayAlerts = True
    objExcel.Visible       = True

    objExcel.Quit                       ' Quit Excel
    Set objExcel = Nothing


■エクセル側■■■■■■■■■■■■■■■■■■■■■■■■■■■■

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━ ThisWorkBook ━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
' +-------------------------------------
' | モジュール間の共通変数
' +-------------------------------------
Dim     xlsFlg_ExcelOpen_AutoMode As String


Private Sub WorkBook_BeforeClose(Cancel As Boolean)
    ' +-------------------------------------
    ' | スケジュール起動ならば、後続の処理は実行しない
    ' +-------------------------------------
    If xlsFlg_ExcelOpen_AutoMode = "1" Then Exit Sub

    Call Save_KigenStatusOverView_AsChart

    Dim returnCode As Integer
    If Range("SystemDataSheet!c8") > 0 Then
       returnCode = MsgBox("期限超過があります。" & vbCrLf &_
                           "このまま閉じますか", _
                           vbYesNo + vbCritical)
        If returnOode = vbYes Theh
            Cancel = False
        EIse
            Cancel = True
        EndIf
    EndIf

End Sub


Private Sub WorkBook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call  Save_KigenStatusOverView_AsChart
End Sub

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Private Sub Workbook_Open()
    ' +-------------------------------------
    ' | このブックがスケジュール起動なのか判定のため変数を取得する
    ' +-------------------------------------
    xlsFlg_ExcelOpen_AutoMode = Environ("envFlg_ExcelOpen_AutoMode")

    ' まずは現状をセーブ
    Call Save_KigenStatusOverView_AsChart
   
    ' +-------------------------------------
    ' | スケジュール起動ならば、後続の処理は実行しない
    ' +-------------------------------------
    If xlsFlg_ExcelOpen_AutoMode = "1" Then Exit Sub

    Worksheets("期限管理台帳").Activate
    Range("Al").Activate

    If Range("SystemDataSheet!c6") > 0 Then
        MsgBox "期限切れ3日前です。" & vbCrLf & _
              〝対応して下さい", _
               vbExclamaion
    End If
End Sub


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━標準モジュール━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Sub Save_KigenStatusOverView_AsChart()
    Dim LocationOfSystemStatus Ad String
        LocationOfSystemStatus = "\\serverX\Pub\- - -\Status\"

    Dim image_FilenameOfKigenStatusOverview As String
    image_FilenameOfKigenStatusOverview = "KigenStatus_OverView.png"

    Dim cht As Chart
    Range("SystemDataSheet!D12:D14").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    Set cht = Worksheets("SystemDataSheet").ChartObjects.Add(200, 200, Range("SystemDataSheet!D12:D14").Width,Range("SystemDataSheet!D12:D14").Height).Chart
    cht.Paste
    cht.Export  Filename:=LocationOfSystemStatus + image_FilenameOfKigenStatusOverview, FilterName:="png"
    cht.Parent.Delete
End Sub
■■■■■■■■■■■■■■■■■

2015年5月24日日曜日

日次更新ファイルの 本日の更新を確認する バッチ

:: +------------------------------------------------------------------
:: |名前固定で、日時更新されるファイルに対して
:: |本日の更新が行われているか、チェックするバッチプログラム。
:: |
:: |実際の運用では、スケジューラに このバッチを登録して
:: |定刻起動させることで、運用する
:: |
:: |本日の更新が行われていた場合、
:: |データ解析用のエクセルファイルを開くかどうか、入力待ちにする
:: |
:: |本日の更新が無い(更新日付とPC日付が一致しない)場合、
:: |一定の時間(ここは5秒)をおいて、ウインドウを自動クローズする
:: |※データ解析用のエクセルファイルを開かない場合もこの処理となる
:: +------------------------------------------------------------------
@echo off

dir /T:W "\\aaaa\bbbb\cccc\DailyUpdate.dat" | findstr /B %DATE% > NUL

if %ERRORLEVEL%==0  (
        color 0E
        echo 日次データが本日日付で更新されています
        echo 以下が、その内容です
        echo.
        echo ■ここから■↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        type "\\aaaa\bbbb\cccc\DailyUpdate.dat"
        echo ■ここまで■↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
)  ELSE (
        color 0F
        echo まだ、更新なしです
        goto OWARI
)


echo.
echo 更新されたデータが0件でなければ
echo 解析用のエクセルファイルに、データインポートする必要があります。
echo エクセルファイルを開きますか?
echo.


set  workKeyInputString=
set  /P workKeyInputString="はい→y[Enter] / いいえ→n[Enter] :>"

if %workKeyInputString%==y (
        goto OPEN
)
if %workKeyInputString%==Y (
        goto OPEN
)
goto OWARI


:OPEN
cmd  /C "dataImportExcelFile.lnk"
:: ↑ここでは、バッチと同じディレクトリにある
:: ショートカット(解析用エクセルファイルの)を開いている…が
:: startコマンドで直接、解析用エクセルファイルを開くこともできるので
:: それは、別記事を参照のこと


:OWARI
echo 5秒後に、このウインドウを閉じます
ping localhost -n 5 > NUL


echo on
:: -eod-

2015年5月9日土曜日

複数のエクセルファイル から 条件に合ったもの を 開く バッチ_02

◆前回記事に、ファイル0件時の処理を追加しました。

特定ディレクトリにある 一個以上のエクセルファイルから 更新日付が最新のものを開くための バッチプログラム

仕様
ターゲットディレクトリは、バッチファイル内に直書きする
更新日付が最新のエクセルファイルを開く…としているが、DIRコマンドのオプションで変更可能

↓↓↓ここから↓↓↓↓↓↓↓
@echo off
:: -------------------------------------------------------------------
:: エクセルファイルのオープン
:: -------------------------------------------------------------------

:: ローカルPCのエクセルパスを設定する
set      work_ExcelProgramPath=C:\Program Files\Microsoft Office\………\EXCEL.EXE

:: ターゲットディレクトリを設定する
set      work_FolderPath=\\………\………\………\

:: ターゲットディレクトリにあるエクセルファイル名(一個以上)を取得する。ソート順は更新日付の直近順
:: ソート結果はテキストファイルに書き出す
dir  /b  /o-d  "%work_FolderPath%"*.xls  >  tempExcelFileNameList.txt

if NOT %ERRORLEVEL%==0 goto FILE_NOT_EXIST


:: 取得したエクセルファイル名(一個以上)から
:: 更新日付が最も新しいエクセルファイル名のみ設定する。
:: ※この場合、複数行のエクセルファイル名が SETコマンドにリダイレクトされる可能性があるが
::   SETコマンドは、改行コードを検出した時点で文字列の取り込みを中止するので、問題は起きない
set  /p  work_FileNameToOpen=  <  tempExcelFileNameList.txt


:: 絶対パスを作成して、設定する
set      work_FullPathOfFile=%work_FolderPath%%work_FileNameToOpen%

:: startコマンドの第一引数は、ウインドウタイトルと見なされるので、ダミーを設定しておく
start  ""  "%work_ExcelProgramPath%"  "%work_FullPathOfFile%"

goto OWARI

:: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
:FILE_NOT_EXIST

color 0E
echo エクセルファイルが(作業のため?)一時的に移動されているようです
echo しばらくして、該当フォルダの中を確認してみてください
echo :
echo :
echo :
echo この画面を閉じますから、何かキーをおしてください
pause > NUL

:: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
:OWARI

echo on

↑↑↑ここまで↑↑↑↑↑↑↑

2015年5月5日火曜日

複数のエクセルファイル から 条件に合ったもの を 開く バッチ

特定ディレクトリにある 一個以上のエクセルファイルから 更新日付が最新のものを開くための バッチプログラム

仕様
ターゲットディレクトリは、バッチファイル内に直書きする
更新日付が最新のエクセルファイルを開く…としているが、DIRコマンドのオプションで変更可能

↓↓↓ここから↓↓↓↓↓↓↓
:: -------------------------------------------------------------------
:: エクセルファイルのオープン
:: -------------------------------------------------------------------

:: ローカルPCのエクセルパスを設定する
set      work_ExcelProgramPath=C:\Program Files\Microsoft Office\………\EXCEL.EXE

:: ターゲットディレクトリを設定する
set      work_FolderPath=\\………\………\………\

:: ターゲットディレクトリにあるエクセルファイル名(一個以上)を取得する。
:: ソート順は更新日付の直近順
:: ソート結果はテキストファイルに書き出す
dir  /b  /o-d  "%work_FolderPath%"*.xls  >  tempExcelFileNameList.txt

:: ↑にて、エクセルファイルが0個の場合が有りえるならば、
:: このタイミングで ERRORLEVEL を調べて、 0 でなければ、相応の処理を行うこと


:: 取得したエクセルファイル名(一個以上)から
:: 更新日付が最も新しいエクセルファイル名のみ設定する。
:: ※この場合、複数行のエクセルファイル名が SETコマンドにリダイレクトされる可能性があるが
::   SETコマンドは、改行コードを検出した時点で文字列の取り込みを中止するので
::   問題は起きない
set  /p  work_FileNameToOpen=  <  tempExcelFileNameList.txt


:: 絶対パスを作成して、設定する
set      work_FullPathOfFile=%work_FolderPath%%work_FileNameToOpen%


:: startコマンドの第一引数は、ウインドウタイトルと見なされるので、ダミーを設定しておく
start  ""  "%work_ExcelProgramPath%"  "%work_FullPathOfFile%"

↑↑↑ここまで↑↑↑↑↑↑↑

2014年5月4日日曜日

アドビ イラストレーター ファイルを開く

アドビ イラストレーター で作成されたファイル(拡張子.ai)を
該アプリケーションが無くても、ファイルを開く方法

拡張子を変更する「.ai」→「.pdf」
…つまり、名目上 PDFファイルにしてしまいます。

拡張子変更後のファイルを
お使いのPDFビューア(Adbe PDF Viewer, Foxit Reader 等)で開きます。
筆者は、Foxit Reader を使用しています

これだけです。

以降も、 .aiファイルを開く機会があるなら
ファイルの関連付けで、 設定しておけばよろしいかと。
  .aiファイルを右クリック→[プログラムから開く]→[プログラムの選択]…

━以上━

2009年9月17日木曜日

CによるCGI作成

※この説明はRedhatLinuxV8.0を元にしている。


サーバ側:受信データの取得(環境変数取得)
    これが受信文字列取得&変数代入。
    書式と変数を増やすだけで、引数の増加に対応可能。 '&%*[^=]=%[^&]' が追加単位。
    書式が入力されるデータの数より多い場合、あまった書式指定は無視されるので、大らかに行きましょう。

    sscanf( getenv("QUERY_STRING"),
        "%*[^=]=%[^&]&%*[^=]=%[^&]&%*[^=]=%[^&]&%*[^=]=%[^&]&%*[^=]=%[^&]&%*[^=]=%[^&]",
        strP1r, strP2, strP3, strP4, strP5, strP6
    );


サーバ側:特定プロセスの状態(StartOrStop)確認
    (例はntpサーバデーモン)
    popen( )を使用することで、grep結果を仮想ファイルに吐き出して、それを読み込んで処理する。

    if( (pFile = popen( "ps -ef |grep ^ntp", "r" ) ) == NULL ){
        fprintf( stderr, "error!\n" );
        exit( -1 );
    }
    sprintf( statusNtp, "dead" );
    while( fgets( strLine, 128, pFile ) ){
        if( 0 == strncmp( strLine, "ntp", 3 ) ){ /* ntpd is Alive */
            sprintf( statusNtp, "alive" );
            break;
        }
    }
    pclose( pFile );


サーバ側:管理者権限コマンドの実行
    ntpサーバのリブート

    1.一般ユーザにて、シェルにリブートコマンドを渡すプログラム作成。
        suNtpReboot.c
            main(){
                setuid( 0 );
                setgid( 0 );
                system( "/etc/rc.d/init.d/ntpd restart" );
            }

    2.rootに切り替え

    3.コンパイル結果のオーナーを変更
        chown root suNtpReboot.o

    4.パーミッション変更
        chmod +s suNtpReboot.o

    5.CGIから実行
        system( "/var/www/cgi-bin/suNtpReboot.o" );


クライアント側:JavaScript-特定画面のリロード

    puts( "\n"
        "
        -->\n\n"
    );



クライアント側:JavaScript-よくある、うるう年チェック

    printf("// 2(Feb.) Proc\n");
    printf("if( document.form.dateMonth.value == 2 ){\n");
    printf("    // LeapYear Check\n");
    printf("    if( ( (( document.form.dateYear.value % 4 ) == 0 )\n");
    printf("      &&(( document.form.dateYear.value % 100 ) != 0 ) )\n");
    printf("              ||\n");
    printf("        ( ( document.form.dateYear.value % 400 ) == 0 )\n");
    printf("    ) { // LeapYear Proc\n");
    printf("        if( document.form.dateDay.value > 29 ){\n");
    printf("            alert(\"指定された月の日数は29日までです\");\n");
    printf("            return false;\n");
    printf("        }\n");
    printf("    } // End of LeapYear Proc\n");
    printf("else{ // Non-LeapYear Proc\n");
    printf("    if( document.form.dateDay.value > 28 ){\n");
    printf("        alert(\"指定された月の日数は28日までです\");\n");
    printf("        return false;\n");
    printf("    }\n");
    printf("    } // End of Non-LeapYear Proc\n");
    printf("} // End of 2(Feb.) Proc\n");

-eod-

2009年8月30日日曜日

CSVファイル内の特定項目に重複があるかチェックする


@echo off
:: *---------------------------------------------------------------------------
:: * WINDOWSバッチプログラム
:: * CSVファイル内の特定項目に重複があるかチェックする
:: * 
:: * 例として、各行の第2項目をチェック対象とする
:: * 第2項目の、カラム位置は(1オリジンで)12桁目から始まるものとする
:: * (11桁目がカンマとなる)
:: * 第2項目に英文字が使用されている場合は、
:: * 大文字・小文字どちらかに統一されているものとする
:: * 
:: * ■動かしてみたが、5000行で15秒以上かかって使い物にならない。
:: * 他に流用できそうな個所があるかもしれないので、残しておく。
:: * 
:: * ■ちなみに、Linux上で実装すると1行で完結する。
:: * sed 's/^.*,//' | sort | uniq --repeated --count
:: * そして、900000行を5秒程で処理できる………
:: * 
:: * ■↑パフォーマンスはPC依存ですよ
:: * 
:: *---------------------------------------------------------------------------


                            :: * ----------------------------------------------
                            :: * 変数初期化
                            :: * ----------------------------------------------
                            :: * 比較文字列バッファ
set PREV_STR=InitialDummyString
                            :: * 重複カウンタ
set /a V_COUNT_DUP=0
                            :: * 重複カウンタ合算。終了メッセージ切り分け用
set /a V_COUNT_DUP_TOTAL=0

                            :: * ----------------------------------------------
                            :: * 入力引数の有無確認
                            :: *   無ければ、プログラム説明を表示して終了
                            :: * ----------------------------------------------
if "" == "%1" goto SETSUMEI_DE_OWARI


                            :: * ----------------------------------------------
                            :: * ファイル内容のソート
                            :: *   各行の12桁目からの文字列が対象
                            :: * ----------------------------------------------
                            :: * 行の内容を分解して、
                            :: * 引数としてサブルーチンに渡す。
                            :: *   セパレータはカンマ
                            :: *   第1項目と第2項目を取得して
                            :: *   第1項目→%%L
                            :: *   第2項目→%%Mに取得するが、
                            :: *   サブルーチン渡すのは%%M(第2項目)のみ
                            :: * ----------------------------------------------
for /f "delims=, tokens=1-2"  %%L in ( 'sort /+12 %1' ) do call :SUB %%M
goto OK_NG_CHECK


                            :: * ----------------------------------------------
                            :: * サブルーチン
                            :: * ----------------------------------------------
:SUB
if "%PREV_STR%" NEQ "%*" (
    set PREV_STR=%*
    if %V_COUNT_DUP% GEQ 1 (
        echo 重複が切れました
        echo 重複項目名:%PREV_STR% 重複回数:%V_COUNT_DUP%
        set /a V_COUNT_DUP=0
    )
) else (
    echo 重複が継続中
    set /a V_COUNT_DUP+=1
    set /a V_COUNT_DUP_TOTAL+=1
)
goto EOF


                            :: * ----------------------------------------------
                            :: * プログラム説明を表示して終了
                            :: * ----------------------------------------------
:SETSUMEI_DE_OWARI
echo.
echo ここに説明を記述する
goto EXIT


                            :: * ----------------------------------------------
                            :: * チェック結果の判定
                            :: * ----------------------------------------------
:OK_NG_CHECK
                                :: * ------------------------------------------
                                :: * ファイル内最終行での重複を
                                :: * 取りこぼさない様に個別チェック
                                :: * ------------------------------------------
if %V_COUNT_DUP% GEQ 1 (
    echo 重複項目名:%PREV_STR% 重複回数:%V_COUNT_DUP%
)
                                :: * ------------------------------------------
                                :: * 結果判定と、メッセージ切り替え
                                :: * ------------------------------------------
if %V_COUNT_DUP_TOTAL% GEQ 1 (
    echo ▲上記のとおり、重複がありました▲▲▲
) else (
    echo △重複はありませんでした△△△△△△△
)


                            :: * ----------------------------------------------
                            :: * 終了
                            :: * ----------------------------------------------
:EXIT
echo.
echo 終了します、何かキーを押してください。
pause > NUL
echo on

特定ソフトのインストール有無を確認する


例:PCにcygwinがインストールされているか
実行パスから調べる。

set Path | findstr /c:"cygwin" > NUL

if "%errorlevel%" == "0" (
   :: 見つかった場合の処理
)else(
   :: 見つからなかった場合の処理
)