72730


バッチファイル初心者です。最近バッチファイルを駆使すれば面倒な作業が簡略化できることを知って勉強中です。  
バッチファイルに任意のファイル名をドラッグ&ドロップすると、そのファイル名を引数として受け取り実行されることを知りました。

環境:  
デスクトップ上のバッチファイル (echo.bat) にテキストファイル (sample.txt) を  
ドラッグ&ドロップ

[code]

    @echo off
    REM %1が受け取る引数
    echo %1
    pause
    
[/code]

->C:\Users\username\Desktop\sample.txt

これを利用すれば、ドラッグ&ドロップして名前を (sample.txt) に変更できます。

[code]

    rename %1 smaple.txt
    
[/code]

ここまでは確認しているのですが、条件分岐の場合、なぜかうまくいきません。  
（D&Dされたファイルが.txtであればsample.txtに変更)

[code]

    @echo off
    REM ドラッグアンドドロップでファイル名を変更
    REM .txtであればsample.txtに名前を変更
    
    if %1 == *.txt (
        rename %1 sample.txt
    ) else (
        echo textファイルではありません
    )
    
    pause
    
[/code]

なぜかテキストファイルをドラッグしても `else()` 部分に飛んでしまいます。  
いろいろ試しましたがわからなく、詳しい方おられましたらご指南のほど  
お願いいただければ幸いです。


CC BY-SA 4.0
2020-12-18T00:53:08.447
72724
2020-12-20T06:12:10.460
2020-12-20T06:12:10.460
3060
41347
question
batch-file
バッチファイルにドラッグ＆ドロップして、テキストファイルであれば名前を変更したい

[code]

    if %1 == *.txt (
        rename %1 sample.txt
    ) else (
    echo textファイルではありません
    )
    
[/code]

を下記に変えてみてください。

[code]

    echo %~n1 | find ".txt" 1>nul
    if not ERRORLEVEL 1 (
    rename %1 sample.txt
    ) else (
    echo textファイルではありません
    )
    
[/code]

これは文字列の中に.txtが含まれるかどうかのチェックをしています。  
従いまして、拡張子で無い場所に.txtが含まれる場合もヒットします。  
もっと厳密に行うためには拡張子とファイル名を分離し、拡張子だけを比較の対象にします。

参考  
<https://karat5i.blogspot.com/2015/02/blog-post_25.html>  
<https://orangeclover.hatenablog.com/entry/20101004/1286120668>


CC BY-SA 4.0
2020-12-18T01:06:28.177
72725
2020-12-18T01:06:28.177
24490
72724
answer

[code]

    if %1 == *.txt (
    
[/code]

上記を下記のように書き換えて[末尾4文字を切り出せば](https://www.upken.jp/kb/kZwpzAqblKfZDjtMXuWuwioeExKNdE.html)拡張子と比較できます。  
ちなみにif文の/Iオプションで拡張子の大文字と小文字を区別しないようにしています。[参照](https://stackoverflow.com/a/12713419)

[code]

    set fullpath=%1
    if /I "%fullpath:~-4%" == ".txt" (
    
[/code]


CC BY-SA 4.0
2020-12-18T01:23:47.583
72728
2020-12-18T01:23:47.583
9820
72724
answer


皆さま微妙にズレていたり複雑にしているような？

`echo %~n1`だとファイル名部分だけであって、拡張子が含まれません。  
拡張子を含めて`find`するには`echo %1`でしょう。

そして環境変数にセットして後ろ4文字を切り出すよりは、単純に`if`の文をこちらにすればよいのでは？

[code]

    if /I "%~x1" == ".txt" (
    
[/code]


CC BY-SA 4.0
2020-12-18T01:36:55.667
72730
2020-12-18T01:36:55.667
26370
72724
answer