web-dev-qa-db-ja.com

ファイルをバッチファイルにドロップして、そのファイル名をバッチファイルのスクリプトに書き込みますか?

次のような内容のbatch.batというバッチファイルがあるとします。

@echo off

C:\path\to\program\program.exe -variables "%1"

そして、file.txtというファイルとfile2.txtという2番目のファイルがあるとします

file.txtをbatch.batにドロップするとします。

私がしたいのは:

  • file.txtがprogram.exeで開きます
  • and batch.batの内容が上書きされ、次のようになります。
    @echo off

    C:\path\to\program\program.exe -variables "file.txt"
  • 今度はbatch.batをダブルクリックすると、program.exeでfile.txtが開きます
  • File2.txtをbatch.batにドロップするまで、ダブルクリックでこれを続けます。その時点で、batch.batの内容は次のように再度上書きされます。
     @echo off

     C:\path\to\program\program.exe -variables "file2.txt"

このコンセプトは可能ですか?バッチファイルの内容は何である必要がありますか?

これが他の簡単な方法で達成できる場合は、私もそれを受け入れます。ただし、メモ帳やその他の機能ではなく、コマンドラインプログラムを実行しているため、引数を指定してコマンドラインコマンドを実行できる必要があります。

4
loopernow

これは、複数のファイルを必要とせず、非常に簡単な方法です。バッチは再作成されませんが、優れた方法で機能すると思います。

@echo off
REM Must be run as  administrator
REM Get the value passed in if any
SET var=%1

REM If a value was passed in, save the value to a system environment variable
if not "%var%"=="" SETX MinJarLastFile %var% -m

REM If nothing was passed in restore from the environment variable
if "%var%"=="" SET var=%MinJarLastFile%

REM Run application with variable
"C:\path\to\program\program.exe" -variables "%var%"

REM Exit
exit /B /0
2

起動するたびにパスを確認する必要がないようにするには、以下を使用します。<input.txt (Set /P "input=")

また、1つの変数のみでこれを実現し、次のようなより堅牢なステータスチェックを行うこともできます。

@ECHO off
    If not "%~1"=="" (
            Set "input=%~1"
        ) Else (
        If exist "input.txt" (
                 <"input.txt" (Set /P "input=")
            ) Else (
            Set /p "input=Path:<"
        )
    )
    For %%A in ("%input%") Do (
        ECHO(%%~A>"input.txt"
        Start "" /d "%%~dpA" "%%~nxA"
    )
    pause
0
T3RR0R

@SeñorCMasMasの助けを借りて、ifsetを使用した解決策を考え出しましたecho(ファイルへ)、およびstartコマンド。

startコマンドには、開こうとしているパスまたはファイルにスペースが含まれている場合、title引数が必要です。さらに、そうである場合は、個別のパス引数とファイル名引数が必要です。したがって、これらの可能性を考慮して、バッチファイルはかなり長くなります。

if not "%~1"=="" set input-title=""
if not "%~1"=="" set input-path="%~dp1"
if not "%~1"=="" set input-file="%~nx1"
if not "%~1"=="" echo %input-title% /d %input-path% %input-file%>input.txt
set /p start-input=<input.txt
start %start-input%

https://ss64.com/nt/syntax-args.html は、バッチファイルに渡された引数が他の変数とは異なる方法で表現されることを説明するのに役立ちました。末尾の「%」。

Windowsの「for」のドキュメンテーション は、変数置換を説明するのに役立ちました。これにより、ドライブ+パス+ファイル変数をそのコンポーネントパーツに分解でき、二重引用符を囲みから削除できます。 「〜」を使用した引数値。

0
loopernow

自分のコンテンツまたは引数の引き渡し(ドラッグアンドドロップファイル)に応じて、自動的に読み取り/書き込みを行うには、batファイルが必要であることを理解しています。

@echo off && setlocal enabledelayedexpansion && cd /d "%~dp0"

if not "%~1" == "" %__APPDIR__%mode.com 40,3 & goto :set_cmd:
type "%~f0"|%__APPDIR__%findstr.exe /b \^; >nul && goto :run_cmd:
goto :error:

:set_cmd:
set "_run="C:\Windows\system32\where.exe" /r "%cd%" "%~nx1" "

( type "%~f0"|%__APPDIR__%findstr.exe /bv \^; & echo/^;!_run!
  rem./See the results in your test & echo/;"%__APPDIR__%timeout.exe" -1
  echo/;endlocal ^&^& goto :EOF ) >"%tmp%\tmp_%~nx0" 

>nul copy /y "%tmp%\tmp_%~nx0" "%~nx0" & endlocal && goto :EOF

:error:
cls & echo= & echo= & endlocal 
echo\ Sorry %username%, no valid argumment was passed^!! 
echo= & echo\ For set command: & echo=
echo\       By Command Line^> %~nx0 "Input_File_.ext"
echo\       By Windows use Drag ^& Drop "input_file_.ext" %~nx0
%__APPDIR__%timeout -1 & goto :EOF

:run_cmd:
echo/ your code will enter/executed bellow here...

このファイルbatをクリックするだけで、ファイルをドラッグアンドドロップせずに初めて、またはコマンドラインから実行した場合引数なしでは、これらの結果が得られます:

 Sorry /UserVarName/, no valid argumment was passed!!

 For set command:

       By Command Line> Q1528263v2.cmd "Input_File_.ext"
       By Windows use Drag & Drop "input_file_.ext" Q1528263v2.cmd

Press any key to continue ...

";"で始まる行を削除しても同じことが起こり、このアクションは元の統計に「リセット」します...

ただし、ドラッグアンドドロップするファイルについては、実行コマンド変数_runの引数として保存されます(これは置換/上書きアクション)。


enter image description here


Obs.:置き換えるだけです:

set "_run="C:\Windows\system32\where.exe" /r "%cd%" "%~nx1" "
set "_run="C:\path\to\program\program.exe" -variables  "%~1" "
0
It Wasn't Me