循环目录的批处理文件搜索结果在单击批处理文件而不是将文件夹拖动到批处理文件时发生更改



问题陈述:将文件夹拖到批处理文件上会更改for循环的结果,而只需单击批处理文件就会从上述for循环中获得不同但所需的输出。

背景:我想在文件夹中检索最新创建的.jar文件名。.bat文件将位于.jar所在的文件夹中。使用下面提供的示例.bat文件代码,我双击.bat文件并获得我要查找的结果,例如:{jar_root_dir_path}+"logger-20191030.jar",请参阅下面的"所需输出:">部分以获得澄清。

问题是,这个.bat文件只会在有人将文件夹拖到上面,然后将这些信息传递给.jar文件的情况下使用。这就是我的问题所在。当我把一个文件夹拖到批处理文件上时,我不会得到最新.jar文件的任何文件结果。请参阅下面的"电流输出:">部分,查看问题的输出。

代码:

#Example code 
@echo off
for /f "delims=" %%x in ('dir /od /b logger*.jar') do set latestjar=%%x
echo "%~dp0%latestjar%" + "%~dp0output.txt"
pause

输出:

注意:本问题中的{example_path_here}仅充当实际目录/文件路径的占位符,例如{example_dir}="D:\Installation\Logger\">

电流输出:

File Not Found
{root_directory_of_.bat} + {root_directory_of_.bat_with_output_file_name_appended}
Press any key to continue . . .

所需输出:

{root_directory_of_.bat_with_latest_.jar_file_appended} + {root_directory_of_.bat_with_output_file_name_appended}
Press any key to continue . . .

当您将某个东西"拖动"到批处理文件中时(我认为您的意思是拖动到资源管理器中的批处理文件的图标或批处理文件名上(,它会在另一个工作文件夹中执行(%windir%system32中可能没有.jar文件(。

解决方案:确保工作文件夹是它应该是的。如果它应该是批处理文件所在的同一个文件夹,请使用更改工作文件夹

cd /d "%~dp0"

分析后确定以下内容:

  1. 双击事件将在.bat所在的当前文件夹中执行。

  2. 文件夹拖放事件导致执行发生在拖放文件夹的父目录所在的位置。

第2点是问题的根源。为了纠正这个问题,我们"cd"回到.bat文件的目录,以完成我们的原始代码。

以下是问题的已纠正示例代码的示例:

@echo off
cd /d %~dp0
for /f "delims=" %%x in ('dir /od /b logger*.jar') do set latestjar=%%x
echo "%~dp0%latestjar%" + "%~dp0output.txt"
pause

以下是我努力实现的最终结果:

@echo off
cd /d %~dp0
for /f "delims=" %%x in ('dir /od /b logger*.jar') do set latestjar=%%x
java -jar "%~dp0%latestjar%" %1 > "%~dp0output.txt"

最后一个代码段/最终结果的解释:-文件夹被放到文件资源管理器中的批处理文件中-1.代码重置回.bat文件目录2.我们遍历目录中名称相似的.jar文件,找到最近创建的文件。3.我们运行最新的.jar文件,参数是拖放文件夹的路径,然后我们将.jar的输出输出到与批处理文件位于同一文件夹中的output.txt文件。

最新更新