У меня есть четыре вещи , которые вы можете попробовать:
(1) Попробуйте указать полный путь для cmd.exe
(например, на моем компьютере: C:\WINDOWS\SYSTEM32\CMD.EXE
).
(2) Попробуйте добавить call
к исполняемой команде:
Process.Start(@"C:\WINDOWS\SYSTEM32\CMD.EXE", @"/c call D:\a.cmd");
(3) Кроме того, я могу только догадываться, откуда исходит %1
в Win32Exception
. Возможно, ваши файловые ассоциации установлены неправильно.
Если вы введете в командной строке следующее:
> assoc .cmd
Вы, вероятно, получите упоминание о cmdfile
. Если вы затем посмотрите на этот токен с:
> ftype cmdfile
Вы можете получить ответ в следующем виде:
cmdfile="%1" %*
Эти настройки хранятся в реестре, и именно так интерпретатор командной строки знает, как выполнять файлы с пользовательскими расширениями. (Вы можете узнать, как запускается документ PDF, выполнив два вышеуказанных оператора для расширения .pdf
.)
(4) Если вы начинаете подозревать, что ваш компьютер может быть неправильно настроен, запустите regedit
(редактор реестра) и найдите ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
.
На моем компьютере с Windows XP (и ваш Process.Start
пример работает на моем компьютере, хотя и с разными именами файлов), у меня там хранятся следующие значения:
// Name Type Value
// -----------------------------------------------
// (standard) REG_SZ (not set)
// AutoRun REG_SZ
// CompletionChar REG_DWORD 0x00000040 (64)
// DefaultColor REG_DWORD 0x00000000 (0)
// EnableExtensions REG_DWORD 0x00000001 (1)
// PathCompletionChar REG_DWORD 0x00000040 (64)
Из них значение AutoRun
может представлять некоторый интерес. Я думаю, что это соответствует ключу командной строки /d
cmd.exe
, который определяет, пытается ли cmd.exe
запускать файлы с пользовательскими расширениями. Обычно это включено. Может быть, на вашей машине это не так?