VBScript (WSH): аргументы не передаются через сопоставление файлов - PullRequest
2 голосов
/ 04 февраля 2012

Обновление

Я отредактировал hkcr\vbsfile\shell, чтобы оно отражало hkcr\vbsfile\shell. Аргументы все еще не работают при использовании ассоциации типов файлов для VBScript.

Интересно, не сработают ли эти ключи реестра:

:: reg query hkcr /f vbs*

HKEY_CLASSES_ROOT\.vbs
...
HKEY_CLASSES_ROOT\VBS
HKEY_CLASSES_ROOT\VBS Author
HKEY_CLASSES_ROOT\VBScript
HKEY_CLASSES_ROOT\VBScript Author
HKEY_CLASSES_ROOT\VBScript.Encode
HKEY_CLASSES_ROOT\VBScript.RegExp
HKEY_CLASSES_ROOT\VBSFile
HKEY_CLASSES_ROOT\VBSFile.HostEncode
Suchvorgang abgeschlossen: 21 übereinstimmende Zeichenfolge(n) gefunden.

Я не могу переименовать HKEY_CLASSES_ROOT\VBS или HKEY_CLASSES_ROOT\VBScript, даже при запуске regedit в качестве администратора.

:: reg query hkcr\vbs /s

HKEY_CLASSES_ROOT\vbs\CLSID
    (Standard)    REG_SZ    {B54F3741-5B07-11cf-A4B0-00AA004A55E8}

HKEY_CLASSES_ROOT\vbs\OLEScript
    (Standard)    REG_NONE


:: reg query hkcr\vbscript /s

HKEY_CLASSES_ROOT\vbscript
    (Standard)    REG_SZ    VB Script Language

HKEY_CLASSES_ROOT\vbscript\CLSID
    (Standard)    REG_SZ    {B54F3741-5B07-11cf-A4B0-00AA004A55E8}

HKEY_CLASSES_ROOT\vbscript\OLEScript
    (Standard)    REG_NONE


:: reg query hkcr\clsid\{B54F3741-5B07-11cf-A4B0-00AA004A55E8} /s

HKEY_CLASSES_ROOT\clsid\{B54F3741-5B07-11cf-A4B0-00AA004A55E8}
    (Standard)    REG_SZ    VB Script Language

HKEY_CLASSES_ROOT\clsid\{B54F3741-5B07-11cf-A4B0-00AA004A55E8}\
  Implemented Categories

HKEY_CLASSES_ROOT\clsid\{B54F3741-5B07-11cf-A4B0-00AA004A55E8}\
  Implemented Categories\{F0B7A1A1-9847-11CF-8F20-00805F2CD064}
    (Standard)    REG_NONE    

HKEY_CLASSES_ROOT\clsid\{B54F3741-5B07-11cf-A4B0-00AA004A55E8}\
  Implemented Categories\{F0B7A1A2-9847-11CF-8F20-00805F2CD064}
    (Standard)    REG_NONE    

HKEY_CLASSES_ROOT\clsid\{B54F3741-5B07-11cf-A4B0-00AA004A55E8}\InprocServer32
    (Standard)    REG_SZ    C:\Windows\SysWOW64\vbscript.dll
    ThreadingModel    REG_SZ    Both

HKEY_CLASSES_ROOT\clsid\{B54F3741-5B07-11cf-A4B0-00AA004A55E8}\OLEScript
    (Standard)    REG_NONE    

HKEY_CLASSES_ROOT\clsid\{B54F3741-5B07-11cf-A4B0-00AA004A55E8}\ProgID
    (Standard)    REG_SZ    VBScript

Оригинальный пост

Скрипты не получают аргументы, переданные им через командную строку, когда вызываются через сопоставление типов файлов вместо cscript.exe или wscript.exe.

:: type args.vbs
Option Explicit
WScript.Echo WScript.Arguments.Count
Dim arg
For Each arg In WScript.Arguments
        WScript.Echo arg
Next

:: cscript args.vbs eins zwei drei
3
eins
zwei
drei

:: wscript args.vbs eins zwei drei
:: : same thing via the MessageBox

:: args.vbs eins zwei drei
0

:: : Why is that?
:: assoc .vbs
.vbs=VBSFile

:: ftype VBSFile
VBSFile="%SystemRoot%\System32\WScript.exe" "%1" %*

Похоже, эта ассоциация типов файлов передает все аргументы скрипту. Но, может быть, это не используется? Как я могу отследить это? Вот больше информации из реестра:

:: reg query hkcr\.vbs

HKEY_CLASSES_ROOT\.vbs
    (Standard)    REG_SZ    VBSFile

HKEY_CLASSES_ROOT\.vbs\PersistentHandler

:: reg query hkcr\VBSFile\Shell\Open /s

HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command
    (Standard)    REG_EXPAND_SZ    "%SystemRoot%\System32\WScript.exe" "%1" %*


:: reg query hkcr\VBSFile\Shell\Open2 /s

HKEY_CLASSES_ROOT\VBSFile\Shell\Open2
    (Standard)    REG_EXPAND_SZ    Open &with Command Prompt
    MUIVerb    REG_EXPAND_SZ    @%SystemRoot%\System32\wshext.dll,-4511

HKEY_CLASSES_ROOT\VBSFile\Shell\Open2\Command
    (Standard)    REG_EXPAND_SZ    "%SystemRoot%\System32\CScript.exe" "%1" %*

Это Windows 7 Pro 64, если это имеет значение (что я не думаю, что это имеет значение). Еще одна вещь: аргументы работают корректно во всех трех случаях (cscript.exe, wscript.exe, сопоставление типов файлов) с использованием механизма JScript со следующим скриптом:

var argc = WScript.Arguments.Length;
WScript.Echo(argc);
for (var i = 0; i < argc; i++)
        WScript.Echo( WScript.Arguments(i) );

Настройки:

:: assoc .js
.js=JSFile

:: ftype JSFile
JSFile=C:\Windows\System32\WScript.exe "%1" %*

:: reg query hkcr\jsfile\shell\open\command

HKEY_CLASSES_ROOT\jsfile\shell\open\command
    (Standard)    REG_SZ    C:\Windows\System32\WScript.exe "%1" %*


:: reg query hkcr\jsfile\shell\open2\command

HKEY_CLASSES_ROOT\jsfile\shell\open2\command
    (Standard)    REG_SZ    C:\Windows\System32\CScript.exe "%1" %*

1 Ответ

1 голос
/ 04 февраля 2012

Решение

Искал в реестре cscript. В моем реестре был следующий ключ:

:: reg query HKEY_CLASSES_ROOT\Applications\cscript.exe /s
...
HKEY_CLASSES_ROOT\Applications\cscript.exe\shell\open\command
    (Standard)    REG_SZ    "C:\Windows\System32\cscript.exe" "%1"

Как только я установил его на "C:\Windows\System32\cscript.exe" "%1" %*, аргументы начали работать правильно для VBScript, используя сопоставление файлов. (Отдых в любом случае был в порядке.)

...