複数の.pptをスライドショー形式(.pps)にぽちぽち名前をつけて保存する、を一括して実行するマクロなjscript。

  • 指定されたpptをスライドショー(pps)で書き出す。
  • エクスプローラ上でpptまたはフォルダをjsにドロップするか、コマンドプロンプトから実行
  • フォルダを指定した場合、同フォルダ内(直下)の*.pptを処理対象にする。
  • ファイル名.ppt→ファイル名.pps、同名のppsが既に存在する場合、問答無用で上書き
  • 実行は自己責任で行ってください。いかなる結果にも責任を負いかねます。

cscript save_as_pps.js /out:出力ディレクトリ {入力ppt|入力フォルダ}...
  - 出力先明示
cscript save_as_pps.js {入力ppt|入力フォルダ}...
  - 元pptと同じフォルダに出力

ちらっとgoogle先生に聞いてみたら、2003以前だと拡張子をppsにするだけでいいらしい。。。

■手元の環境
Windows XP Pro SP3 + MS Office 2003 Professional SP3
Windows Vista Ultimate SP1 x64 + MS Office 2007 Standard SP1
■save_as_pps.js
/**
* 指定されたpptをスライドショー(pps)で書き出す。
* エクスプローラ上でpptまたはフォルダをjsにドロップするか、
* コマンドプロンプトから実行
*
* cscript save_as_pps.js /out:出力ディレクトリ {入力ppt|入力フォルダ}...
* - 出力先明示
*
* cscript save_as_pps.js {入力ppt|入力フォルダ}...
* - 元pptと同じフォルダに出力
*
* フォルダを指定した場合、同フォルダ内(直下)の*.pptを処理対象にする。
*
* My env.
* - Windows XP Pro SP3 + MS Office 2003 Professional SP3
* - Windows Vista Ultimate SP1 x64 + MS Office 2007 Standard SP1
*/


// PowerPoint
var PpSaveAsFileType= {
ppSaveAsPresentation: 1,
ppSaveAsPowerPoint7: 2,
ppSaveAsPowerPoint4: 3,
ppSaveAsPowerPoint3: 4,
ppSaveAsTemplate: 5,
ppSaveAsRTF: 6,
ppSaveAsShow: 7,
ppSaveAsAddIn: 8,
ppSaveAsPowerPoint4FarEast: 10,
ppSaveAsDefault: 11,
ppSaveAsHTML: 12,
ppSaveAsHTMLv3: 13,
ppSaveAsHTMLDual: 14,
ppSaveAsMetaFile: 15,
ppSaveAsGIF: 16,
ppSaveAsJPG: 17,
ppSaveAsPNG: 18,
ppSaveAsBMP: 19
};


// --------------------------------------------------------------


/**
* pptファイルをppsでsaveasする
*
*/
function SaveAsPPS() {
this.initialize.apply(this, arguments);
}

SaveAsPPS.prototype = {
initialize: function() {
this.fso = WScript.CreateObject("Scripting.FileSystemObject");
},

/**
* 1ppt分の処理
*
*/
saveOne: function(app, options, fn_ppt) {
var dir_out;
if(options.samefolder) {
// 元pptと同じフォルダに出力
dir_out = this.fso.GetParentFolderName(fn_ppt);
} else {
// 出力先が明示されている
dir_out = options.out;
}

if(!this.fso.FolderExists(dir_out)) {
this.fso.CreateFolder(dir_out);
}

var prs = app.Presentations.Open(fn_ppt, true, true, false);

try {
var fn_out = this.fso.BuildPath(dir_out, this.fso.GetBaseName(fn_ppt) + ".pps");
prs.SaveAs(fn_out, PpSaveAsFileType.ppSaveAsShow, options.embedfont);
} catch(ex) {
throw ex;
} finally {
prs.Close();
}
},

/**
* main
*
* @param argv WScript.Arguments
*/
main: function(argv) {
// オプション
var opt = argv.Named;

var options = {
// 出力先フォルダ
out: ".",
// 保存先を元pptと同じにするflag
samefolder: true,
// フォントを埋め込むかどうか
embedfont: true
};

if(opt.Item("nofont")) {
options.embedfont = false;
}

if(opt.Item("out")) {
options.out = opt.Item("out") ;
options.samefolder = false;
}
options.out = this.fso.GetAbsolutePathName(options.out);

var ppt_app = new ActiveXObject("PowerPoint.Application");

try {
// 引数
var args = argv.Unnamed;
for(var i = 0 ;i < args.length; i++) {
var fn_ppt = this.fso.GetAbsolutePathName(args(i));
if(this.fso.FolderExists(fn_ppt)) {
// 引数がフォルダなら、当該フォルダ内のpptを処理対象に
var folder = this.fso.GetFolder(fn_ppt);
for(var it = new Enumerator(folder.Files); !it.atEnd(); it.moveNext()) {
var file = it.item();
if(file.Name.match(/\.ppt$/i)) {
fn_ppt = file.Path;
this.saveOne(ppt_app, options, fn_ppt);
}
}
} else if(this.fso.FileExists(fn_ppt)) {
// 引数がファイルの場合
this.saveOne(ppt_app, options, fn_ppt);
} else {
WScript.echo("*** ppt not found: " + fn_ppt);
return false;
}

}

} catch(ex) {
throw ex;
} finally {
ppt_app.Quit();
}

}
}

// --------------------------------------------------------------

var app = new SaveAsPPS();
app.main(WScript.Arguments);