Как я заставляю сценарии Perl распознать параметры в Win32 cmd консоль?

ODBC + freetds + библиотека оболочки Python для ODBC.

6
задан Keith Bentrup 8 November 2009 в 05:29
поделиться

3 ответа

Я выяснил, в чем проблема. Хотя значения ftype и assoc были установлены, как было предложено, фактическое поведение в моей системе, похоже, определяется ключом реестра

HKEY_CLASSES_ROOT\Applications\perl.exe\shell\open\command

. Строковое значение (по умолчанию) должно быть "C : \ Perl \ bin \ perl.exe ""% 1 "% *

Когда я нашел эту запись, она была установлена ​​на " C: \ Perl \ bin \ perl.exe ""% 1 ". Его замена сразу устранила проблему.

Почему это было установлено именно так? Я не знаю. Может быть, из предыдущей установки?

В любом случае, спасибо за предложения, и я надеюсь, что этот ответ поможет и кому-то другому.

17
ответ дан 8 December 2019 в 03:27
поделиться

Обновление: Учитывая, что следующее верно, остается только убедиться, что расширения команд не отключены. Попробуйте ввести в командной строке

cmd / e: on

, прежде чем запускать тесты. См. Также документацию по cmd Windows XP :

Включение и отключение расширений команд

Расширения команд включены в Windows XP по умолчанию. Вы можете отключить их для определенного процесса, используя / e: off. Вы можете включить или отключить расширения для всех параметров командной строки cmd на компьютере или в пользовательском сеансе, установив следующие значения REG_DWORD :

HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Command Processor \ EnableExtensions \ REG_DWORD

HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor \ EnableExtensions \ REG_DWORD

Задайте значение REG_DWORD равным 0x1 [11] включен) или 0x0 (то есть отключен) в реестре с помощью Regedit.exe. Заданные пользователем параметры имеют приоритет над параметрами компьютера, а параметры командной строки имеют приоритет над параметрами реестра.

E:\Temp> assoc .pl
.pl=Perl
E:\Temp> ftype Perl
Perl="C:\opt\Perl\bin\perl.exe" "%1" %*
E:\Temp> @echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PL;.PLX;.WPL;.py;.pyw
E:\Temp> cat t.pl
print "'$_'\n" for @ARGV;
E:\Temp> t a b c d e f g h j
'a'
'b'
'c'
'd'
'e'
'f'
'g'
'h'
'j'

Я использовал практически все дистрибутивы ActiveState Perl с 2004 года. Этих параметров достаточно, чтобы заставить его работать.

2
ответ дан 8 December 2019 в 03:27
поделиться

Хммм ... похоже, что файловая ассоциация для * .pl как-то испорчена. Я не использую Windows, поэтому я не могу это проверить. Вы можете проверить информацию о сопоставлении файлов с помощью команды ASSOC или FTYPE в командной строке. IIRC, « ASSOC .pl » должен сообщить вам, что такое тип файла , а « FTYPE filetype command » сообщает оболочке, что нужно делать с Perl-скриптом. Попробуйте что-нибудь вроде:

C:\> ASSOC .pl=perlscript
C:\> FTYPE perlscript=C:\Perl\bin\perl.exe %1 %*

Судя по виду одной из ссылок на команды , которая должна помочь. Я предполагаю, что текущая ассоциация не передает параметры скрипту. Вы можете проверить это с помощью ASSOC. pl , чтобы выяснить, как называется ассоциация файлов, а затем с помощью FTYPE распечатать команду, которую оболочка собирается выполнить.

Обновление

Я обнаружил интересную вещь что хочу отметить для потомков. Я начал видеть именно эту проблему на машине друга при работе с некоторыми скриптами Python. ASSOC и FTYPE привели к ожидаемому результату, но параметры все еще не передавались - в точности то, что сообщалось изначально .

После небольшого рытья, Я обнаружил, что параметры реестра были созданы где-то вдоль строки как значения REG_SZ . Я удалил их и заново создал, используя ASSOC и FTYPE , и все начало работать ...

8
ответ дан 8 December 2019 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: