Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理文件以打开程序,移动文件,然后在手动程序关闭时替换文件_Windows_Batch File - Fatal编程技术网

Windows 批处理文件以打开程序,移动文件,然后在手动程序关闭时替换文件

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

更具体地说,我想使用批处理文件来加载“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:\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\"