2015-10-17 32 views
0

运行我的批处理脚本后,如何保持命令窗口不会关闭。我想保持打开状态以进行故障排除和测试。它关闭后,我把平,如果errorlevel部分英寸我的代码是否正确,我怎样才能阻止它关闭?即使脚本中存在“PAUSE”,运行脚本后仍会关闭命令窗口

@echo on 

for /f %%a in (pclist.txt) do ( 

ping -n 1 \\%%a > NUL 
IF ERRORLEVEL 0 (goto :copyhost1) ELSE goto :skipcopyhost1 

:copyhost1 

ROBOCOPY "\\%%a\C$\folder" "\\servername\folder" /MOVE 

ROBOCOPY "\\%%a\C$\folder2" "\\servername\folder2" /MOVE 

ROBOCOPY "\\%%a\C$\folder3" "\\servername\folder3" /MOVE 

:skipcopyhost1 

) 

PAUSE 

这是我知道的不工作:

@echo on 

for /f %%a in (pclist.txt) do ( 
ROBOCOPY "\\%%a\C$\folder" "\\servername\folder" /MOVE 

ROBOCOPY "\\%%a\C$\folder2" "\\servername\folder2" /MOVE 

ROBOCOPY "\\%%a\C$\folder3" "\\servername\folder3" /MOVE 

) 

PAUSE 

回答

2

可能是所有问题的根源是标签和goto命令。

  • 不应里面的代码(括号中的代码)块定义标签。通常这些标签会导致解析错误。

  • for里面使用goto命令会取消for并且不会再有更多的值被迭代。

此外,您的if errorlevel n构造的使用也存在问题。对于大于或等于n的任何错误级别值,此条件评估为true。这使得您的条件被评估为真,除了负值之外的所有错误级别值。

ping命令也是一个问题的来源(更多信息请阅读here)。检查机器是否在线的常用方法是使用find命令测试输出中是否存在TTL=字符串。如果找到字符串(errorlevel = 0),则ping成功,如果未找到(errorlevel = 1),则说明机器处于脱机状态。

@echo on 
    setlocal enableextensions disabledelayedexpansion 

    for /f %%a in (pclist.txt) do ( 
     ping -n 1 %%a | find "TTL=" > nul 
     if not errorlevel 1 (
      ROBOCOPY "\\%%a\C$\folder" "\\servername\folder" /MOVE 
      ROBOCOPY "\\%%a\C$\folder2" "\\servername\folder2" /MOVE 
      ROBOCOPY "\\%%a\C$\folder3" "\\servername\folder3" /MOVE 
     ) 
    ) 
    pause 
+0

我仍然遇到脚本没有保持打开状态的问题,脚本根本不工作,必须关闭某些功能。 – MPineda

+0

确定忽略早先的评论,它保持打开,但它不是robocopying文件夹,他们仍然从源位置。 – MPineda

+0

它跳过处于脱机状态的工作站,但不处理在线的工作站的robocopy。 – MPineda

0

你肯定ROBOCOPY是不是失败?

尽量只此:

@echo on 

for /f %%a in (pclist.txt) do ( 

ping -n 1 \\%%a > NUL 
IF ERRORLEVEL 0 THEN goto :copyhost1 ELSE goto :skipcopyhost1 

:skipcopyhost1 
echo test 
:copyhost1 
echo test1 

) 

PAUSE 

是否暂停?如果是,请添加第一个robocopy命令,保存该文件并再次运行。如果成功,请添加下一个等等。上述批处理命令在Windows 10 32位上工作正常,我希望它也能适用于你。

+0

是的,这个保持打开状态,不知道robocopy命令可能会出现什么问题。 – MPineda

+0

向此脚本添加一个robocopy命令并查看会发生什么。脚本是否暂停? – zedfoxus

+0

没有结束工作,可能是@MC ND状态超过 – MPineda

1

首先,我几乎是批处理脚本的新手,但我会指出一些我用原始代码注意到的事情。


@echo on <- Isn't needed as echo is enabled by default, this will only tell you that echo is enabled. 

for /f %%a in (pclist.txt) do (<- I imagine that pclist.txt has a list of IP's, fine and dandy, we'll work with that. 

ping -n 1 \\%%a > NUL <- The \\ isn't needed >NUL isn't required for my corrected proposed solution. 
IF ERRORLEVEL 0 THEN goto :copyhost1 ELSE goto :skipcopyhost1 <- Ping, not really setup to handle ERRORLEVEL. 

提示未来,IF%ERRORLEVEL%== 0 GOTO等等

:skipcopyhost1 <- Next couple lines, shouldn't be in the loop 
echo test 
:copyhost1 
echo test1 

) <- Should be moved up a few lines 

PAUSE 

现在,这种解决方案会工作,即使你已经pclist.txt混合活跃/ nonactive主机,这将继续,直到文件结束。正如我所提到的,PING并没有真正设置为处理ERRORLEVEL,因此我们将命令传递给FINDSTR以搜索仅​​在活动主机中找到的文本,这也会抑制ping对话框。找到主机后,将ip设置为%Host%,这就是您必须为robocopy引用它的方式。除了摆脱%% a之外,我并没有弄乱robocopy命令。无论如何,希望这是你正在寻找的。

@ECHO OFF 

FOR /F %%a in (pclist.txt) DO (
CLS 
TITLE Pinging %%a 
PING -n 1 %%a | FINDSTR TTL && SET Host=%%a && CALL :CopyHost 
) 
EXIT 

:CopyHost 
TITLE Copying files to: %Host% 
ROBOCOPY "\\%Host%\C$\folder" "\\servername\folder" /MOVE 
ROBOCOPY "\\%Host%\C$\folder2" "\\servername\folder2" /MOVE 
ROBOCOPY "\\%Host%\C$\folder3" "\\servername\folder3" /MOVE 
GOTO :EOF 
+0

的问题这看起来没有工作,它试图从\\%a而不是从实际的计算机名称列表中进行robocopy。 – MPineda

+0

就像我说过的,我根本没有惹上'robocopy'。只是将'%% a'换成'%Host%'。我最关心的是让批处理文件正确地从文本文件中ping主机列表。 %% a不应该与robocopy有任何关系,这就是为什么%host%被设置的原因。 –

+0

不应该robocopy仍然在do()中吗?我几乎是一个脚本初学者,所以我不会真的知道! – MPineda

相关问题