2012-01-27 8 views
2

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

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

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

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

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

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

Поскольку исправление похоронен в инсталлятор PostgreSQL (и я представил bug report), Я могу только work around проблемы, если установщик не будет изменен.

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

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

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

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

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

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

Любые советы по вопросам 1 и 2 будут оценены по достоинству.

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

+0

Я решил проблему и опубликует ответ через 7 часов (новый пользователь, извините). В основном мне пришлось удалить этот ключ: HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \ .bat, как указано [здесь] (http://help.lockergnome.com/windows/BAT-File-Association-Broken- -ftopict514456.html) – cod3monk3y

ответ

4

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

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

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, и Troubleshoot Compatability) и двойной щелчок по пакетному файлу, исполняемому пакетом.

. Бат-ключ сгенерирован автоматически через некоторое время после его удаления и дважды щелкнул мой тестовый пакетный файл. При этом автоматически генерируется запись была:

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

+1 для самостоятельного изучения и совместного использования подробного решения. – Tomalak

0

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

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

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

+1

Спасибо за вход dbenham. hello.bat был простым «echo hello> _hello.txt» без явного EXIT. Проблема заключалась в том, что hello.bat на самом деле не вызывался. Появилась командная строка, но командный файл не запущен. Дело не в том, что файл bat * не удался * во время работы; его вообще не называли! Re: ваш второй пункт: пакетный файл выйдет даже без явной команды EXIT. Если командный файл работал и зависал, cmd.exe/c все равно зависает, ожидая завершения команды. Моя проблема оказалась переопределением расширения файла (см. Мой собственный ответ). Спасибо за ваш вклад, хотя! – cod3monk3y

Смежные вопросы