我想创建一个 shell 扩展来运行闪亮的在 Windows 7 Professional 64 位上的本地进程中运行应用程序。我需要一个命令,如R -e "shiny::runApp('~/shinyapp')"
所定义的在闪亮的教程网页中。我通常会在每个数据文件夹中创建一个名为的目录shiny
。因此,假定的命令应该总是类似这样的:R -e "shiny::runApp('%1'/shiny) for me."
因此我在 HKEY_CLASSES_ROOT\Directory\shell 中创建了一个名为“Shine!”的键和一个名为“command”的子键,其值为C:\Program Files\R\R-2.15.1\bin\x64\R.exe -e "shiny::runApp('%1/shiny')"
regedit 中的 dir 结构如下:
现在,每当我右键单击数据文件夹(包含 shiny 文件夹)并单击“Shine!”时,R 控制台(cmd 控制台)都会打开和关闭,但应用程序不起作用(应用程序已经过彻底检查并正常运行,我还检查了 cmd 中的 regedit 命令)。
说实话,我不懂 C、Windows Shell 或任何 MSDN 内容。我查过几个问题,链接和文件,但更愿意提出一个不进行错误检查(缺少文件夹等)的简单解决方案。
我想我在这里遗漏了一个语法错误,所以我尝试了几个版本,例如仅'%1'
右键单击 shiny 文件夹,还有类似'/'%1/'/shiny'
等的版本。哪里出了问题,更重要的是,当 cmd 窗口快速关闭时,我该如何使用 %1 来调试右键单击?
答案1
%1 由 Windows shell 扩展为您右键单击的文件夹的名称。
因此,如果您要执行的命令是:
"C:\Program Files\R\R-2.15.1\bin\x64\R.exe" -e "shiny::runApp('%1/shiny')"
您可以将其替换为对 cmd.exe 的调用,该调用在执行后保持打开状态并保留双引号(通过在额外的一对双引号内将它们加倍),以便您可以检查 r.exe 的命令输出:
cmd /k " ""C:\Program Files\R\R-2.15.1\bin\x64\R.exe"" -e ""shiny::runApp('%1/shiny')"" "
我没有使用 R 的经验,但我的猜测是 runApp 命令不能很好地处理 Windows 路径中的反斜杠,或者它包含空格,并且我还猜测“~”适用于当前目录,因为 Windows 没有真正的 $HOME 目录。
解决方案是通过 cmd.exe 链接 CD 命令和 R.exe 调用:
cmd /c " cd /d ""%~1"" & ""C:\Program Files\R\R-2.15.1\bin\x64\R.exe"" -e ""shiny::runApp('~/shiny')"" "
(cmd /c 关闭新窗口,cmd /k 在执行后保持其打开,因此最后一个例子在启动 R.exe 后关闭窗口)。
答案2
使用 ProcessMonitor 确定启动的 R 的确切参数和工作目录。获取这些值后,您可以使用相同的设置来设置调试器。