Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
Batch file 为什么所有已启动的应用程序都不按预期将所需信息保存在文本文件中?_Batch File_Save - Fatal编程技术网

Batch file 为什么所有已启动的应用程序都不按预期将所需信息保存在文本文件中?

Batch file 为什么所有已启动的应用程序都不按预期将所需信息保存在文本文件中?,batch-file,save,Batch File,Save,我正在尝试在USB驱动器上创建一个批处理文件,该文件将运行.exe,将其文本保存为.txt文件,然后关闭.exe 我目前遇到了一个奇怪的问题,18个.exe中只有5个在将文本保存到文件中 这是我用来完成任务的惯例: start IEPassView.exe /stext Results/IEPassView.txt taskkill /f /im IEPassView.exe start MailPassView.exe /stext Results/MailPassView.txt tas

我正在尝试在USB驱动器上创建一个批处理文件,该文件将运行.exe,将其文本保存为.txt文件,然后关闭.exe

我目前遇到了一个奇怪的问题,18个.exe中只有5个在将文本保存到文件中

这是我用来完成任务的惯例:

start IEPassView.exe /stext Results/IEPassView.txt 
taskkill /f /im IEPassView.exe

start MailPassView.exe /stext Results/MailPassView.txt
taskkill /f /im MailPassView.exe

start MessenPass.exe /stext Results/MessenPass.txt
taskkill /f /im MessenPass.exe

start RouterPassView.exe /stext Results/RouterPassView.txt
taskkill /f /im RouterPassView.exe

start ProtectedStoragePassView.exe /stext Results/ProtectedStoragePassView.txt
taskkill /f /im ProtectedStoragePassView.exe

start DialUpPassView.exe /stext Results/DialUpPassView.txt
taskkill /f /im DialUpPassView.exe

我把上面的18个块放在一行中,它们都在调用不同的小程序,尽管其中5个确实保存了文件,但它们都没有像有时那样保存.cfg文件。非常感谢您提供的任何帮助。

我建议您在结束时立即终止所有任务,可能是在发出超时命令后,时间长度与您的系统速度相适应。这可能有助于解决问题。

主要有三种不同类型的可执行文件:

  • 控制台应用程序正在从stdin或文件中读取数据并写入stdout或文件,并将错误消息输出到stderr

    批处理文件的处理在启动控制台应用程序时停止,直到控制台应用程序自行终止。因此,正确的术语是:调用控制台应用程序

    控制台应用程序的退出代码分配给环境变量ERRORLEVEL,如果ERRORLEVEL X rem执行某些操作,也可以直接使用
    进行评估

    Windows的
    System32
    目录中的许多*.exe都是这样的控制台应用程序,如
    find.exe
    findstr.exe
    ping.exe

  • GUI(图形用户界面)应用程序作为新进程启动,这意味着在GUI应用程序自行终止之前,Windows命令处理器不会停止批处理

    要从此类应用程序的命令进程中获取某些信息是不容易的。GUI应用程序设计用于通过图形用户界面与用户交互,而不是通过标准流或带有命令进程的文件

    此类应用程序的典型示例是Windows目录中的Windows Explorer
    Explorer.exe

  • 混合应用程序支持这两种界面,因此可以在命令过程中使用,也可以由用户通过GUI使用

    混合应用程序很少,因为不容易编码。混合应用程序在批处理文件中的使用行为必须通过测试来确定

    此类应用程序的示例有Windows注册表编辑器
    regedit.exe
    或共享软件归档工具WinRAR
    WinRAR.exe

最好看一些简单的例子,看看在批处理文件中启动/调用所有3种类型的应用程序的区别

控制台应用程序示例:

@echo off
cls
%SystemRoot%\System32\ping.exe 127.0.0.1 -n 5
echo.
echo Ping finished pinging the own computer (localhost).
echo.
pause
@echo off
cls
%WinDir%\Explorer.exe
echo.
echo Windows Explorer opened and is still running!
echo.
pause
@echo off
cls
"%ProgramFiles%\WinRAR\WinRAR.exe"
echo.
echo User exited WinRAR.
echo.
pause
命令处理将暂停,直到
ping.exe
自身终止,这需要4秒钟。此类应用程序不需要
start
call
,除非控制台应用程序应在单独的过程中有意执行

GUI应用程序示例:

@echo off
cls
%SystemRoot%\System32\ping.exe 127.0.0.1 -n 5
echo.
echo Ping finished pinging the own computer (localhost).
echo.
pause
@echo off
cls
%WinDir%\Explorer.exe
echo.
echo Windows Explorer opened and is still running!
echo.
pause
@echo off
cls
"%ProgramFiles%\WinRAR\WinRAR.exe"
echo.
echo User exited WinRAR.
echo.
pause
此批处理文件输出文本和消息提示,在启动Windows资源管理器后立即按任意键,指示Windows资源管理器作为单独的进程启动,Windows命令处理器立即在批处理文件的下一行继续。因此,尽管Windows资源管理器已启动且仍在运行,但批处理也在继续

混合应用程序示例:

@echo off
cls
%SystemRoot%\System32\ping.exe 127.0.0.1 -n 5
echo.
echo Ping finished pinging the own computer (localhost).
echo.
pause
@echo off
cls
%WinDir%\Explorer.exe
echo.
echo Windows Explorer opened and is still running!
echo.
pause
@echo off
cls
"%ProgramFiles%\WinRAR\WinRAR.exe"
echo.
echo User exited WinRAR.
echo.
pause
如果在默认安装目录中安装,则此批处理文件启动WinRAR时不带任何参数(通常在批处理文件中不有用)。但批处理会暂停,直到用户退出WinRAR,例如,单击WinRAR应用程序窗口的X符号

但是打开命令提示符窗口并在窗口内执行

"%ProgramFiles%\WinRAR\WinRAR.exe"
结果会立即在命令窗口中返回提示,以键入并执行下一个命令。所以WinRAR会找出什么是父进程,并相应地采取行动

Windows注册表编辑器显示相同的行为。在命令提示窗口中执行

%WinDir%\regedit.exe
结果是打开Windows注册表编辑器,但可以立即在命令提示符窗口中输入下一个命令。但在批处理文件中使用此命令会导致停止批处理,直到用户关闭Windows注册表编辑器的GUI窗口

因此,混合应用程序主要在批处理文件中使用参数,以避免用户交互的必要性


好的,回到这个关于各种应用程序的简短课程后的问题

第一个建议是使用

Result\TextFileName.txt
而不是

Result/TextFileName.txt
由于Windows上的目录分隔符是反斜杠字符,可执行文件需要正斜杠作为目录分隔符,因为从Unix/Linux到Windows的移植不好

第二个建议是找出应用程序的类型。命令
start
真的有必要吗?因为应用程序不是在单独的进程中自行启动的,需要用户交互才能自行终止

注意:命令
start
将第一个双引号字符串解释为
title
string。因此,在作为单独进程启动GUI或混合应用程序时,最好将其指定为第一个参数
(空标题字符串)。在作为单独的进程启动控制台应用程序时,通常最好给控制台窗口一个有意义的标题

最后,如果已启动的应用程序真的需要用户交互才能终止,那么最好是在启动后将其关闭