Windows 批处理文件以打开程序,移动文件,然后在手动程序关闭时替换文件
更具体地说,我想使用批处理文件来加载“ProgramX”。然后,一旦程序完全加载并在屏幕上打开,将一些文件从“文件夹a”移动到“文件夹B”。然后,当程序X手动退出时,将先前移动的文件移回文件夹B。下面是我尝试过的,但没有成功。我想不会的Windows 批处理文件以打开程序,移动文件,然后在手动程序关闭时替换文件,windows,batch-file,Windows,Batch File,更具体地说,我想使用批处理文件来加载“ProgramX”。然后,一旦程序完全加载并在屏幕上打开,将一些文件从“文件夹a”移动到“文件夹B”。然后,当程序X手动退出时,将先前移动的文件移回文件夹B。下面是我尝试过的,但没有成功。我想不会的 start "" "C:\ProgramX.exe" move /-y "C:\FolderA\File1.txt" "C:\FolderB\" move /-y "C:\FolderA\File2.txt" "C:\FolderB\" /wait "C:\P
start "" "C:\ProgramX.exe"
move /-y "C:\FolderA\File1.txt" "C:\FolderB\"
move /-y "C:\FolderA\File2.txt" "C:\FolderB\"
/wait "C:\ProgramX.exe"
move /-y "C:\FolderB\File1.txt" "C:\FolderA\"
move /-y "C:\FolderB\File2.txt" "C:\FolderA\"
最初,我制作了两个单独的批处理文件,只需来回移动文件(我手动打开和关闭程序)即可工作,但我希望只有一个批处理文件加载程序,然后移动文件,然后在退出程序后将其移回。您可以构建一个循环(goto)这看起来程序是否仍在运行(if..then),并且您将文件的向后移动放在循环之后
签出此代码段:
tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log
FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end
start notepad.exe
:end
del search.log
它检查notepad.exe是否正在运行。如果未运行,它将启动notepad.exe 简单的方法是
move /-y "C:\FolderA\File1.txt" "C:\FolderB\"
move /-y "C:\FolderA\File2.txt" "C:\FolderB\"
"C:\ProgramX.exe"
move /-y "C:\FolderB\File1.txt" "C:\FolderA\"
move /-y "C:\FolderB\File2.txt" "C:\FolderA\"
或
但是如果您坚持在开始后执行移动
,则
@ECHO关闭
SETLOCAL
启动/b“正在运行”arj.exe的进程
move/-y“C:\FolderA\File1.txt”C:\FolderB“
move/-y“C:\FolderA\File2.txt”C:\FolderB“
回声等待
:等等
任务列表/FI“IMAGENAME eq arj.exe”| FINDSTR/i“arj.exe”>nul&IF错误级别1超时/t 1>nul&goto等待
move/-y“C:\FolderB\File1.txt”C:\FolderA“
move/-y“C:\FolderB\File2.txt”“C:\FolderA\”
回声结束
暂停
后藤:EOF
我在这里使用了arj.exe
来测试该方法。当然,它可以是在用户控制下退出的任何可执行文件,而不是实例化交互实例后立即退出的notepad
我假设在任何时候系统上只有一个programx
实例处于活动状态
出现echo
s和pause
只是为了演示批处理程序状态。我认为这是最有效的方法:
@echo off
rem Start the program and wait until it ends before continue
(
start "process running" "arj.exe"
ping -n 2 localhost > NUL
move /-y "C:\FolderA\File1.txt" "C:\FolderB\" > NUL
move /-y "C:\FolderA\File2.txt" "C:\FolderB\" > NUL
) | set /P "="
move /-y "C:\FolderB\File1.txt" "C:\FolderA\"
move /-y "C:\FolderB\File2.txt" "C:\FolderA\"
在这种方法中,等待状态是事件驱动的(由操作系统控制),因此不会浪费CPU时间!更多详细信息。请不要只说它不起作用。描述下一次代码成功启动程序,但在程序完全加载之前移动了文件时,代码做了什么,没有做什么…然后它立即将文件移回原始文件夹并退出。我之所以知道这一点,是因为我在每个命令之间插入了暂停,这样我就可以看到发生了什么。无论编程语言或平台如何,都无法等待程序完全初始化并以通用方式显示其主UI。解决方案必须是特定于应用程序的。同样,也无法区分手动关闭和自动关闭应用程序。@IInspectable:我不同意。看。@Aacini:你可以同意或不同意你的观点。我陈述了已确定的事实。如果你想不同意事实,你需要一个非常强大的工具。目前,你提出的解决方案没有解决我在先前评论中概述的问题。在系统级别上,无法一般地知道任何给定应用程序的初始化何时运行到某个特定点,在该点上它准备好响应全局状态中的特定更改。所以请关闭@Magoo!唯一的问题是在程序加载之前文件会移动到新文件夹。我想我可以添加一个“暂停”来等待加载…除非有更好的方法?谢谢您可以添加一个超时
,这样用户就不必做任何事情了。这很有效!!谢谢你@Magoo!我唯一的问题是,如果这个程序整天都处于打开状态,批处理文件是否会导致计算机陷入困境,因为它一直在查看程序是否关闭?陷入困境?不是。它每秒查找一次任务-应该是最小的影响。通过增加timeout
参数,如果需要,它将减少影响,缺点是mainapp关闭后的“向后移动”平均时间将增加。明白了。谢谢非常有帮助!我没能让它工作。我遗漏了什么吗?请明确说明问题所在。每个单独的命令都应该按预期运行,并且等待方法已经在链接的答案中得到验证…我将我的程序和文件插入到这个示例中,程序没有启动,文件也没有移动。我只更改了程序位置以及文件夹和文件位置的“arj.exe”。我留下的其余部分作为你的例子。我遗漏了什么吗?请删除带括号的行,并确保代码以与原始代码相同的方式运行,无需等待。在那之后,重新插入带括号的行…删除括号使程序加载,文件像原始文件一样移动,无需等待,但添加括号似乎会扼杀整个过程。什么都没发生,现在出什么问题了?要等待几秒钟,您可以实现代码“ping-n2 localhost>NUL”。“2”表示需要等待多长时间。因此,请选择一个时间,该时间比满负荷所需的时间长application@xs6睡觉
@echo off
rem Start the program and wait until it ends before continue
(
start "process running" "arj.exe"
ping -n 2 localhost > NUL
move /-y "C:\FolderA\File1.txt" "C:\FolderB\" > NUL
move /-y "C:\FolderA\File2.txt" "C:\FolderB\" > NUL
) | set /P "="
move /-y "C:\FolderB\File1.txt" "C:\FolderA\"
move /-y "C:\FolderB\File2.txt" "C:\FolderA\"