我的bat文件无法正常运行,为什么?

时间:2014-09-27 07:00:27

标签: batch-file operating-system

创建一个新文件test.bat,内容如下:

  

echo aa;

并在dos命令行中执行它,

  

test.bat的

窗口中没有输出。但是当我在另一台计算机上测试时,它会输出

  

AA

当我双击bat文件时,即使我在test.bat文件中添加“pause”子句行,它也会突然消失。这两个系统都是Window XP。某人能告诉我问题出在哪里吗?

我已经检查过Mofi建议的所有内容,但问题仍然存在。

现在,我在使用其他管理员帐户重新启动系统时进行分组。一切都很好。

那么,问题是否来自Windows XP的注册表记录?

2 个答案:

答案 0 :(得分:2)

请参阅Iterating over files in directory prepends extra character to filename上的答案,我已经解释了要检查批处理文件是否按预期工作的内容。

首先应验证环境变量 ComSpec PATHEXT PATH 。并检查注册表项命令处理器的值,如引用的答案中所述。 Command Processor自动运行值非常重要。

此外,启动 Regedit 并检查右侧显示的注册表项HKEY_CLASSES_ROOT\.bat的标准值。它应该是batfile。然后转到HKEY_CLASSES_ROOT\batfile,打开它并导航到子标open - command。标准值为"%1" %*。可能是您的Windows注册表部分损坏,这使得无法通过双击运行批处理文件。

检查注册表问题是通过运行

打开命令提示符窗口
C:\Windows\System32\cmd.exe

通过Windows开始菜单中的运行条目。然后从命令提示符窗口中运行批处理文件。

您还应该从命令提示符窗口

运行
C:\Windows\System32\chkdsk.exe C: /F

并确认在下次启动Windows时运行Windows的检查磁盘工具。然后重新启动Windows以使此工具检查文件系统是否存在导致1个或多个损坏文件的错误。如果在文件系统中确实检测到错误,请在Windows从命令提示符窗口开始完成后运行

C:\Windows\System32\chkdsk.exe C: /F /R

确认在下次启动Windows时再次运行此工具,但这次在硬盘的所有扇区上进行读/写测试并修复扇区(如果可能的话)。根据驱动器C的大小,可能需要几个小时才能完成此任务。


于2014-09-28添加:

防病毒应用程序

您是否已经检查了防病毒应用程序的配置?

可能会阻止所有* .bat文件的执行。

Windows系统还原

您是否已尝试将Windows系统还原用于批处理文件执行失败的帐户,并返回到您确定批处理文件执行有效的日期的还原点?

如果ntuser.datntuser.dat.log(=当前用户的注册表)部分损坏或Windows注册表中针对此用户帐户配置错误,这将是恢复工作环境的最简单方法帐户。

流程监控分析

由于批处理文件的执行不仅适用于一个帐户,因此该帐户的注册表中的原因必须是损坏或错误的设置密钥或值。

我建议首先使用批处理文件执行无效的帐户从Sysinternals(Microsoft)下载并运行免费工具Process Monitor

此工具启动时显示的第一个是用于配置过滤器的对话框。从第一个列表中选择进程名称,在第二个列表中选择 ,在编辑字段中输入 cmd.exe ,然后让包含< / strong>在上一个列表中选择。点击包含按钮旁边的,然后点击确定

现在,在Process Monitor的主应用程序窗口中,单击工具栏中的最后3个符号以关闭这些功能,从而仅监视注册表和文件系统访问。通过单击工具栏中的第五个符号或按Ctrl + X清除当前列表。

现在双击Windows资源管理器中的示例批处理文件。然后将batck切换到Process Monitor,向上滚动到开头并逐行查看执行批处理文件时发生的情况。也许你可以看到你认为不正确的东西。

结果应该只显示 SUCCESS NAME NOT FOUND ,很少 NO MORE ENTRIES 用于注册表项在日志中。列结果中的 INVALID 不好。可以使用Ctrl + S或通过单击工具栏中的磁盘符号将日志保存为CSV文件。

退出流程监控,从此帐户注销,登录其他帐户,从此处启动Process Monitor,配置相同的过滤器,执行相同的批处理文件并将此日志另存为CSV文件。比较2个CSV文件并查找差异(时间和行号除外)。

Windows注册表比较

找出导致批处理文件执行不起作用的2个帐户之间的不同之处的另一种方法是比较这2个帐户的注册表配置单元。在这两个帐户中,启动 Regedit 并将整个密钥HKEY_CURRENT_USER导出到* .reg文件。使用文本比较工具比较两个注册表导出。新的管理员帐户肯定更少的键和值。有趣的是那些具有相似但不相同的线的块。

最有趣的是关键:

HKEY_CURRENT_USER\Console
HKEY_CURRENT_USER\Environment
HKEY_CURRENT_USER\Software\Classes\.bat
HKEY_CURRENT_USER\Software\Classes\batfile
HKEY_CURRENT_USER\Software\Microsoft\Command Processor

此列表中的某些键可能完全丢失。这样就可以了,因为在这种情况下,Windows会考虑HKEY_LOCAL_MACHINE下的相同密钥。但是当一个密钥丢失在帐户中哪个批处理文件执行失败时,它应该也在其他帐户中丢失,或者这里出现问题。

可能是一个很大且难以找到的问题是在使用 Regedit 查看注册表树时显示的注册表项,但是当单击该键时无法读取它。

我已经多次看到这种部分损坏的注册表项,并且很难修复这样的注册表错误。例如,如果应用程序删除了注册表项而未将其从注册表的索引表中删除,则会发生这种情况。

如果索引中存在注册表项,但在注册表中不再存在,则会发生意外情况。例如,我修复了HKLM\Software\Classes\mailto在索引列表中的问题,但在注册表中不再存在。当用户单击mailto链接时,Windows开始在Outlook中开始创建新电子邮件,直到Windows资源耗尽并且用户重新启动Windows。

答案 1 :(得分:0)

请在echo之前添加@,如下所示:

@echo aa
@pause

它在我的Windows 7机器上工作。