【问题标题】:Batch file Start program批处理文件启动程序
【发布时间】:2023-12-22 20:50:01
【问题描述】:

好吧,我之前写过一些批处理文件,所以我对它们并不完全陌生,但这让我很困惑。我要做的是从批处理文件中运行 .exe 文件。这是批处理脚本:

@echo off
:start
setlocal EnableDelayedExpansion
cd "C:\Users\Zac\Dropbox\SoundCloud"
set n=0
for %%f in (*.html*) do (
set /A n+=1
set "file[!n!]=%%f"
)
set /A "rand=(n*%random%)/32768+1"
move "!file[%rand%]!" C:\Users\Zac\Temp
start "~dp0Link_Open.exe"
echo %time%
timeout 70 > NUL
echo %time%
goto start

所以据我了解,这会将随机的 .html 文件从一个目录移动到另一个目录,这很有效,我用过很多次,唯一的问题是“开始”命令,我不经常使用这个. “Link_Open.exe”与我的 .bat 位于同一文件夹中,但我尝试使用写入的完整目录运行它,我尝试过引用,没有引号,括号,没有括号,开始,开始,开始,调用,调用,调用,都不行,老是报同样的错误“找不到Link_Open.exe,你写对了吗?”

我能想到的唯一原因是它为什么不起作用,是 .exe 是用 AutoIT 编写然后编译的......但这不应该影响它吗?

运行批处理文件会导致随机文件被移动,然后出现错误,然后重复。

我做错了什么?

Ps:运行 Link_Open.exe 完成了它应该做的事情,所以那里没有错误,我唯一遇到的问题是用 .bat 打开它。

我对 Autoit 还是很陌生,但如果有人可以向我展示一个使用 Autoit 移动随机 .html 文件的脚本,我可以将这两个脚本组合在一起,不是吗?

【问题讨论】:

  • 您是否尝试过使用link_open.exe 的完整路径?如果应用程序位于path 上的任何目录中,那么它应该被执行。我相信有一些杂草丛生的反病毒系统会阻止应用程序的执行,直到它们得到特别授权。最好在批处理 start 之后包含一对假兔子耳朵 (""),因为第一个引用的参数可能会被用作 Windows 标题 - 但这里可能不是这种情况。需要准确知道可执行文件在哪里以及%~dp0 在哪里(在批处理中显示 - echo %~dp0
  • @Zachary Wight 您的“start "~dp0Link_Open.exe"" 缺少 ~ 之前的 %

标签: batch-file call autoit


【解决方案1】:

前提是你的bat文件和exe文件和你说的在同一个目录下试试改:

START Link_Open.exe

到:

start "%~dp0Link_Open.exe"
  • %~dp0 扩展为当前批处理脚本的路径
  • start相当于START,没关系
  • 用引号括起来,以防您的路径有C:\My Documents 之类的空格,从而将整个路径保留为一个参数,而不是被误解为由空格分隔的多个参数

错误说明

您的错误:Link_Open.exe cannot be found... 就是这样,批处理找不到Link_Open.exe。通常它会,因为当你只给一个没有完整绝对路径的程序时,它会检查当前工作目录。这默认为批处理脚本所在的位置。但请注意,您实际上用这一行更改了当前工作目录:

cd "C:\Users\Zac\Dropbox\SoundCloud"

因此,除非您碰巧在该 SoundCloud 目录中有 Link_Open.exe,或者除非您有任何代码可以将 cd 返回到包含 exe 的批处理脚本目录,或者除非您碰巧在 @987654333 中有 Link_Open.exe @,那么批处理就没有理由自动知道检查运行脚本的原始目录。

因此,我们尝试以批处理知道如何找到它的方式引用Link_Open.exe。一种方法是,如果我们使用绝对路径 C:\path\to\Link_Open.exe,但为了保持可移植性,我建议将 %~dp0 扩展为 whatever path of the current batch script,因此批处理能够再次找到 Link_open.exe

【讨论】:

  • start 将引号中的第一个参数作为窗口标题。因此它应该是:start "" "%~dp0Link_Open.exe" (empty dummy title)
  • @user454038 所以我尝试了“%~dp0Link_Open.exe”,它从我的 SoundCloud 目录打开了第二个命令提示符窗口,这个额外的窗口什么也不做,我可以手动输入命令,但就是这样.我尝试将 Link_Open.exe 放入 SoundCloud 目录,同样的事情发生了。移动 .bat 和 .exe 会再次导致相同的结果。我输入错误了吗? (我已经用更新的脚本编辑了我的原始帖子。)
  • 有些程序只使用start programname.exe,但我不确定 Link_Open.exe 通常会做什么。当您在与 Link_Open.exe 相同的文件夹中创建一个简单的批处理文件 test.battest.bat : start "%~dp0Link_Open.exe" 时会发生什么?仅此一项有效吗?现在每个@Stephan 说,如果创建和编辑test2.bat 不起作用:start "" "%~dp0Link_Open.exe" 会起作用吗?
【解决方案2】:
  1. 您将目录更改为 C:\Users\Zac\Dropbox\SoundCloud,然后尝试启动留在脚本目录中的 Link_Open.exe。

  2. 所以下一步你使用 ~dp0 变量从执行的脚本中获取文件夹,但是缺少前导 %:你必须写 %~dp0

  3. 即使你会修复它,也许 Link_Open.exe 也依赖于当前工作目录? start 允许设置 CWD:start "window header" /D "%~dp0" "%~dp0Link_Open.exe"

要调试:在start 之前添加echo 并在下一行添加pausestart 命令将打印,所有变量都展开。你会看看是否有问题 - e。 G。您可以通过 Start -> Run 复制和测试。

【讨论】:

  • @user454038 使用行 start "" "%~dp0Link_Open.exe" 有效,这正是我想要的。只是一个简单的问题,为什么我需要空的“”,这只是指向文件所在的目录吗?如果是这样,为什么手动将其指向那里不起作用?
  • @ZacharyWight 这是新窗口的可选标题。有时start 在没有这个选项的情况下也能工作,但有时,如您所见,不能。
最近更新 更多