Colours of autumn
Blog

Microsoft Office для Mac перестал работать

Тут в очередной раз помер офис (перестал запускаться с руганью содержащей среди прочего Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000000) и так как перестанавливать офис каждый раз мне уже порядком надоело, а падает он в такое состояние с завидной периодичностью - решил таки разобраться с сутью проблемы.
А суть оказалась в следующем - где-то в недрах офиса, в папке /Applications/Microsoft\ Office\ 2011/Office/ умирают символические ссылки (что в последнее время для мака весьма характерно и неоднократно мною было замечено в ходе, например, экспериментов с Ruby on Rails). Так вот, чтобы вылечить офис делаем следующее.

Переходим в рабочий каталог

cd /Applications/Microsoft\ Office\ 2011/Office/

Находим все битые ссылки

find -L . -type l
./MSXML.framework/MSXML
./MSXML.framework/Versions/Current
./MViewLib.framework/MViewLib
./MViewLib.framework/Resources
./MViewLib.framework/Versions/Current
./OfficeArt.framework/OfficeArt
./OfficeArt.framework/Resources
./OfficeArt.framework/Versions/Current
./SmartArt.framework/Resources
./SmartArt.framework/SmartArt
./SmartArt.framework/Versions/Current
./wlmstrings.framework/Resources
./wlmstrings.framework/Versions/Current
./wlmstrings.framework/wlmstrings


Далее либо переходим в каждый каталог из списка и исправляем ссылку ручками, либо запускаем в каждом каталоге следующий shell-скрипт

#!/bin/bash

OFFICE="/Applications/Microsoft Office 2011/Office/"
VERSION="14"
RESOURCES="Versions/$VERSION/Resources"

echo "Settings"
echo "Office Directory : $OFFICE"
echo "Office Version : $VERSION"
echo "Resources Directory: $RESOURCES"
echo

sudo unlink Resources
sudo ln -s $RESOURCES Resources
cd Versions
sudo unlink Current
sudo ln -s $VERSION Current
cd ..

Ну и на закуску perlовый-скрипт который все сделает одним махом

#!/usr/bin/perl
# This script checks the filenames in a directory and report for any broken symbolic links
# Author: BigDiver
# Version 1.0
# Date: 03/26/2013

# Office version
my $version = 14;

# Office install directory
my $office_dir = "/Applications/Microsoft Office 2011/";

use File::Find ();

die("Dir not found: " . $office_dir) if( ! -d $office_dir );
my %broken;
my $user = `whoami`;
chomp $user;

if( $user !~ /root/i ) {
print "Script running as user $user\n";
print "You must run this script as root. Try sudo $0\n";
exit(-1);
}

print "Office Directory: $office_dir\n";
print "Office Version: $version\n";

File::Find::find({wanted => \&wanted}, $office_dir); # Calling wanted subroutine which use stat function to match broken links

foreach $d (keys %broken) {
print "Fixin $d\n";
unlink $d . "/Resources";
symlink "$d/Versions/$version/Resources", "$d/Resources";
unlink "$d/Versions/Current";
symlink "$d/Versions/$version", "$d/Versions/Current";
}
print "Done\n";

sub wanted {
my $file = $_;
if (-l $file) {
my $target = readlink $file;
if ( ! -e $target && ! -l $target ) {
my $dir = $File::Find::dir;
$dir =~ s/\.framework.+$/\.framework/;
$broken{$dir} = 1;
}
}
}
0 ▲
28 May 2013 9:31
source
Please, register (it is quick and easy!) or sign in, to leave comments and do much more fun stuff.