2013-05-14 6 views
19

にWordのdocxファイルを変換する私はPDFへのWord DOCXのバッチ変換を行うためにPowerShellを使用しようとしています - このサイトに掲載されていたスクリプト使用: http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/24/weekend-scripter-convert-word-documents-to-pdf-files-with-powershell.aspx基本PowerShellの - バッチは、PDF

# Acquire a list of DOCX files in a folder 
$Files=GET-CHILDITEM "C:\docx2pdf\*.DOCX" 
$Word=NEW-OBJECT –COMOBJECT WORD.APPLICATION 

Foreach ($File in $Files) { 
    # open a Word document, filename from the directory 
    $Doc=$Word.Documents.Open($File.fullname) 

    # Swap out DOCX with PDF in the Filename 
    $Name=($Doc.Fullname).replace("docx","pdf") 

    # Save this File as a PDF in Word 2010/2013 
    $Doc.saveas([ref] $Name, [ref] 17) 
    $Doc.close() 
} 

をそして、私は続けますこのエラーが発生し、理由を把握できません:

PS C:\docx2pdf> .\docx2pdf.ps1 
Exception calling "SaveAs" with "16" argument(s): "Command failed" 
At C:\docx2pdf\docx2pdf.ps1:13 char:13 
+  $Doc.saveas <<<< ([ref] $Name, [ref] 17) 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

アイデアをお持ちですか?

また、ローカルファイル(スクリプトの場所と同じ場所にあるファイル)を使用するだけでなく、doc(docXではなく)ファイルを変換するにはどのように変更する必要がありますか?

申し訳ありません - PowerShellスクリプトをやったことがない...

答えて

42

これは、ドキュメントなどのdocxファイルのために動作します。

$documents_path = 'c:\doc2pdf' 

$word_app = New-Object -ComObject Word.Application 

# This filter will find .doc as well as .docx documents 
Get-ChildItem -Path $documents_path -Filter *.doc? | ForEach-Object { 

    $document = $word_app.Documents.Open($_.FullName) 

    $pdf_filename = "$($_.DirectoryName)\$($_.BaseName).pdf" 

    $document.SaveAs([ref] $pdf_filename, [ref] 17) 

    $document.Close() 
} 

$word_app.Quit() 
+4

これは働いていた - 感謝 - '$のdocuments_path =分割経路-parent $ MyInvocation.MyCommand.Path' – takabanana

+0

を使用してスクリプトの場所に基づいて動的にする$のdocuments_pathを変更OLEDBが使用されていますこの変換では? – culter

+2

また、COMオブジェクトを解放する必要があります: '[System.Runtime.Interopservices.Marshal] :: ReleaseComObject($ word_app)'。変数全体を削除することも[The Scripting Guys](http://technet.microsoft.com/en-us/library/ff730962.aspx)で提案されています: 'Remove-Variable word_app' – ComFreek

3

これは(Word 2007の)私の作品:

$wdFormatPDF = 17 
$word = New-Object -ComObject Word.Application 
$word.visible = $false 

$folderpath = Split-Path -parent $MyInvocation.MyCommand.Path 

Get-ChildItem -path $folderpath -recurse -include "*.doc" | % { 
    $path = ($_.fullname).substring(0,($_.FullName).lastindexOf(".")) 
    $doc = $word.documents.open($_.fullname) 
    $doc.saveas($path, $wdFormatPDF) 
    $doc.close() 
} 

$word.Quit() 
1

ここに掲載されているソリューションのいずれも、Windows 8.1(btw。私はOffice 365を使用しています)では役に立ちませんでした。私のPowerShellは何とか[ref]引数が嫌いです(私はなぜ、私はまれにPowerShellを使用するのか分かりません)。

これは私のために働いたソリューションです:私の周り7万ワード文書をこのように変換するバッチジョブをしていたとして

$Files=Get-ChildItem 'C:\path\to\files\*.docx' 

$Word = New-Object -ComObject Word.Application 

Foreach ($File in $Files) { 
    $Doc = $Word.Documents.Open($File.FullName) 
    $Name=($Doc.FullName).replace('docx', 'pdf') 
    $Doc.SaveAs($Name, 17) 
    $Doc.Close() 
} 
0

上記の答えはすべて、私のために及びませんでした。それが判明したので、これを繰り返し実行すると、おそらくメモリの問題が原因でWordがクラッシュすることになります(このエラーは、解析する方法がわからないCOMExceptionでした)。だから、それを進めるための私のハックは、100人の文書(任意に選んだ番号)ごとに単語を殺して再起動することでした。

さらに、時折クラッシュしたときに、結果として不正な形式のPDFが作成され、それぞれのサイズは一般に1〜2kbです。だから、既に生成されたpdfsをスキップするとき、私は彼らが少なくとも3kbのサイズであることを確かめます。既に生成されたPDFをスキップしたくない場合は、そのif文を削除できます。

私のコードがよく見えない場合は、私は一般的にWindowsを使用しないでください、これは一回限りのハックでした。だから、ここ結果のコードがあります:

$Files=Get-ChildItem -path '.\path\to\docs' -recurse -include "*.doc*" 

$counter = 0 
$filesProcessed = 0 
$Word = New-Object -ComObject Word.Application 

Foreach ($File in $Files) { 
    $Name="$(($File.FullName).substring(0, $File.FullName.lastIndexOf("."))).pdf" 
    if ((Test-Path $Name) -And (Get-Item $Name).length -gt 3kb) { 
     echo "skipping $($Name), already exists" 
     continue 
    } 

    echo "$($filesProcessed): processing $($File.FullName)" 
    $Doc = $Word.Documents.Open($File.FullName) 
    $Doc.SaveAs($Name, 17) 
    $Doc.Close() 
    if ($counter -gt 100) { 
     $counter = 0 
     $Word.Quit() 
     [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Word) 
     $Word = New-Object -ComObject Word.Application 
    } 
    $counter = $counter + 1 
    $filesProcessed = $filesProcessed + 1 
} 
関連する問題