VBScript зависает при запуске командного файла с помощью WShell.Script Run - PullRequest
2 голосов
/ 27 января 2012

Во время установки PostgreSQL 9.1.2 на моем Windows 7 64-bit Home Premium установка зависла.После долгого яростного поиска я обнаружил, что проблема заключалась в том, что установщик VB Script завис в ожидании завершения пакетного файла в скрытом окне.

Я выделил проблему в следующую строку кода:

Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "hello.bat", 1, True

(где 1 устанавливает WindowStyle на Visible, а True ожидает завершения).Вызов Run запустил командную строку, но не выполнил командный файл.Таким образом, это никогда не будет завершено.

Я решил проблему, запустив cmd.exe вместо командного файла напрямую, согласно многочисленным онлайн-источникам:

objShell.Run "%COMSPEC% /c hello.bat", 1, True

Поскольку исправление скрыто в установщике PostgreSQL (и яМы отправили отчет об ошибке ), я могу только обойти проблему, если не будет изменен установщик.

Но мои основные вопросы:

  1. Почему первый звонок зависает?
  2. Зачем использовать% COMSPEC% вместо непосредственного вызова пакета?

Что касается # 2, может ли это быть из-за того, что выполнение .bat напрямую предполагает, что действие по умолчанию связанос файлом .bat это выполнить?В прошлом (на других машинах) я изменял это действие по умолчанию на «Редактировать».И если бы я это сделал, я бы также повесил установщик PostgreSQL!(Я представляю)

Пакетный файл выполняется нормально на других машинах.Так что на этом ноутбуке есть что-то странное.Что касается № 1, мне нужно выяснить, почему этот ноутбук отличается.Я должен отметить, что на этой машине есть некоторые странные поведения с пакетными файлами (которые я только что заметил):

  1. Действия контекстного меню содержат только «Открыть» и отсутствуют «Редактировать», «Выполнить»"," Запуск от имени "
  2. Двойной щелчок командного файла открывает командную строку, но не выполняет командный файл

I , просто заметил # 2, покапишу это.Очевидно, что действие по умолчанию для .bat испорчено.Вчера я чуть не забил свой компьютер, удалив обработчики контекстного меню из своего реестра, как рекомендовали несколько сайтов, пытаясь восстановить мои записи «Редактировать», «Выполнить» и т. Д.

Буду признателен за любые советы по вопросам 1 и 2.,

Спасибо, Эрик

Ответы [ 2 ]

4 голосов
/ 28 января 2012

Проблема заключалась в переопределении HKCU для .bat, которое создало ассоциацию с cmd.exe, как отмечалось в этом замечательном сообщении .Дополнительная помощь была найдена здесь .

Мой реестр выглядел так:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bat
    \OpenWithList
        (Default)   REG_SZ    (value not set)
        a           REG_SZ    NOTEPAD.EXE
        MRUList     REG_SZ    a
    \OpenWithProgids
        (Default)   REG_SZ    (value not set)
        batfile     REG_NONE  (zero-length binary value)
    \UserChoice
        (Default)   REG_SZ    (value not set)
        Progid      REG_SZ    (Applications\cmd.exe)

Удаление всей записи .bat исправило все.Все пункты контекстного меню были восстановлены должным образом (Open, Edit, Print, Run as Administrator и Troubleshoot Compatability), и двойной щелчок на файле пакета выполнил пакет.

Ключ .bat автоматически перегенерировался через некоторое время после того, как я удалил его и дважды щелкнул мой тестовый пакетный файл.Эта автоматически сгенерированная запись была:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bat
    \OpenWithList
        (Default)   REG_SZ    (value not set)
    \OpenWithProgids
        (Default)   REG_SZ    (value not set)
        batfile     REG_NONE  (zero-length binary value)

В конечном счете, именно ключ \UserChoice вызвал мою проблему.Так что теперь я все прояснил.Мои тестовые сценарии работают правильно, я переустановил PostgreSQL с нуля, и установка прошла гладко.

E

0 голосов
/ 28 января 2012

1-й вызов запускает окно, которое остается открытым, пока что-то не скажет ему закрыться.Prsumably hello.bat завершается командой EXIT, которая, конечно, закрывает окно, и ваша установка затем может продолжаться.

Но hello.bat не запускается на вашем компьютере, поэтому, конечно,окно никогда не закрывается, и ваша установка зависает.

2-й вызов через% COMSPEC% открывает окно и запускает CMD.EXE с параметром / C «команда».Спецификация для параметра / C гласит, что CMD.EXE прекратит работу после того, как «команда» завершится (или не выполнится).Ваша "команда" - "hello.bat".Закрытие окна больше не зависит от команды EXIT в файле hello.bat.Окно закроется, даже если hello.bat не запускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...