如何将桌面 Linux 中的文件类型与通过 VirtualBox 运行的 Windows 7 应用程序关联起来,以便它们无缝工作,并在需要时启动 VirtualBox?
我正在使用 KDE。
目前的方法
(Excel 文件示例):
在开始菜单中添加一个名为“Excel”的新条目
- 命令:/home/USER/bin/excelstarter.sh %f
- 见下文
- 启动反馈效果不佳,因此已禁用
通过右键单击并选择运行方式将 .xlsx 文件与“Excel”关联
- 记住所有类型文件的应用程序关联...
在VirtualBox中挂载相关文件夹
VirtualBox 主窗口 > 计算机设置 > 共享文件夹:
- 添加:
- 文件夹路径:/data
- 自动安装
- 永久化
- 添加:
- 文件夹路径:/home/USER
- 自动安装
- 永久化
- 添加:
禁用对空密码的组策略限制
如果没有此更改,如果未设置密码,VirtualBox 将不会运行命令。
- 运行 gpedit.msc
导航
计算机配置\Windows 设置\安全设置\本地策略\安全选项
改变
限制本地帐户仅使用空白密码进行控制台登录 到残疾人。
excelstarter.sh
这里的想法是,如果 VirtualBox 尚未运行,则该文件负责启动 VirtualBox,等待其启动,然后使用已转换为 VirtualBox 中设置的相应安装的文件路径启动 Excel。
# Start VM (if it is already started this does nothing)
VBoxManage startvm "win7_hilti"
# Replace folders with windows-local versions (mounts need to be setup)
# /data/ is mounted as F:
original=$1
findWhat=\/data/
replaceWith="F:\\"
fixedFilePath="${original/$findWhat/$replaceWith}"
# /home/USER/ is mounted as G:
original=$fixedFilePath
findWhat=\/home\/USER/
replaceWith="G:\\"
fixedFilePath="${original/$findWhat/$replaceWith}"
# Used for debugging the file paths
#notify-send $fixedFilePath
# Start Excel
# Try to run it until it the machine has started
until VBoxManage guestcontrol "VM-NAME" start --exe "C:\\Program Files\\Microsoft Office\\Office14\\EXCEL.EXE" --username WINDOWSUSER "excel" -- "$fixedFilePath"
do
# Sleep 1 gave the problem that the mounts were not yet ready, sleep 2 seems to work fine
sleep 2
done
问题
- 如果 VirtualBox 已经在后台运行,则它不会获得焦点。
- 在等待 VirtualBox 启动时,丑陋的睡眠在循环中。睡眠 1 在安装尚未设置的情况下出现了问题。在速度较慢的机器上,可能需要增加该值。
- 有时,VirtualBox 启动后它不会启动 Excel。
参考
答案1
一些调整:
-- 我没有硬编码应用程序的路径,而是使用 cmd.exe 启动命令:
options=( --username WINDOWSUSER --exe "%SystemRoot%\system32\cmd.exe" -- 'cmd' /c start "run this" "$fixedFilePath" )
其中 $fixedFilePath 与您的代码中相同。即使 $fixedFilePath 包含空格,这些选项也有效。
这概括了脚本——它现在适用于任何类型的文件,而不仅仅是 Excel 文件。
如果 $fixedFilePath 是 Windows 客户机中程序的完整路径,它也应该起作用; %PATH 上程序的名称(带扩展名);或名称(带扩展名)(如果是已注册程序),例如 winword.exe、excel.exe。
然后我在 stderr 上测试了 VBoxManage guestcontrol 返回的字符串:
nError=1
nTries=0
while [ $nError -gt 0 ] && [ $nTries -lt 20 ]; do
nError=$(VBoxManage guestcontrol win7_hilti start "${options[@]}" 2>&1 >/dev/null | grep -c "error")
((++nTries))
sleep 2
done
(其中一些是我借来的这个来源)