Windows shell 集成命令不起作用,可能是语法错误

Windows shell 集成命令不起作用,可能是语法错误

我想创建一个 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 的确切参数和工作目录。获取这些值后,您可以使用相同的设置来设置调试器。

相关内容