将文件拖放到批处理文件中以将该文件名写入批处理文件的脚本中?

将文件拖放到批处理文件中以将该文件名写入批处理文件的脚本中?

假设我有一个名为 batch.bat 的批处理文件,其内容如下:

@echo off

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

假设我有一个名为 file.txt 的文件和一个名为 file2.txt 的第二个文件

假设我将file.txt拖放到batch.bat上。

我希望发生的事情是:

  • file.txt 使用 program.exe 打开
  • 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"

这个概念可行吗?批处理文件内容需要是什么?

如果可以通过其他简单的方式实现,我也可以接受。但我需要能够运行带参数的命令行命令,因为我正在运行命令行程序,而不是记事本或诸如此类的东西。

答案1

这是一种不需要多个文件并且非常简单的方法。虽然它不会重新创建批处理,但我认为它的效果更好。

@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

在@SeñorCMasMas 的帮助下,我想出了一个解决方案,使用如果回声(保存到文件),以及开始命令。

开始如果您要打开的路径或文件包含空格,则命令需要标题参数。此外,如果是这种情况,它还需要单独的路径参数和文件名参数。因此,我的批处理文件要长得多,以允许这些可能性。

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”的文档对于解释变量替换很有用,它允许您将驱动器+路径+文件变量分解为其组成部分,并允许您使用“〜”从参数值中删除括住的双引号。

答案3

为了避免每次启动时都必须确认路径,请使用以下命令: <input.txt (Set /P "input=")

您还可以仅使用一个变量来实现这一点,并进行更强大的状态检查,如下所示:

@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

答案4

我知道您需要一个 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...

如果你点击这个文件第一次不拖放任何文件,或者从命令行运行而不带参数,您将得到以下结果:

 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(这是一个替换/覆盖操作)。


在此处输入图片描述


观察:只需替换:

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

相关内容