2012-04-25 59 views
3

我試圖運行一些代碼,查找所有.doc & .docx文件在目錄&子目錄中,然後將每個文件轉換爲PDF格式。當文件已存在時Powershell - SaveAs函數

下面的代碼只能如果在這些目錄中,即它僅適用第一次沒有PDF的實例。隨後每次失敗時:

Exception calling "SaveAs" with "2" argument(s): "Command failed" At C:\convert\convertword.ps1:12 char:13 + $doc.saveas <<<< ($path, $wdFormatPDF) + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation

當我刪除以前創建的PDF並重新運行PS時,它工作正常。因此,我只能假設我從我的SaveAs函數中錯過了一個開關或參數,它以某種方式強制覆蓋?

$wdFormatPDF = 17 
$word = New-Object -ComObject word.application 
$word.visible = $false 
$folderpath = "c:\convert\*" 
$fileTypes = "*.docx","*doc" 
Get-ChildItem -path $folderpath -recurse -include $fileTypes | 
foreach-object ` 
{ 
$path = ($_.fullname).substring(0,($_.FullName).lastindexOf(".")) 
"Converting $path to pdf ..." 
$doc = $word.documents.open($_.fullname) 
$doc.saveas($path, $wdFormatPDF) 
$doc.close() 
} 
$word.Quit() 
+0

的鏈接爲什麼不只是測試的路徑的文件,然後刪除,項目就試圖保存,如果它存在過嗎? – EBGreen 2012-04-25 15:07:21

回答

2

好吧,我終於想我已經找到了問題所在。這是鎖定文件的Windows資源管理器預覽窗格。我已經顯示預覽窗格打開文件被創建和轉換的目錄,這一定是在pdf上創建了文件鎖,因此腳本無法保存新的pdf。我在我的Windows資源管理器中關閉了預覽窗格,現在腳本反覆使用!因此Powershell腳本沒什麼問題,但是感謝所有的輸入人員。下面是最近的MS KB文章,我能找到關於這個問題http://support.microsoft.com/kb/942146

0

有沒有標誌根據對SaveAsSaveAs2的文件覆蓋。

​​
+0

添加的代碼的removeItem線,現在有不同的errorUnexpected令牌 '(' 在表達式或語句 在C:\轉換\ convertword.ps1:13字符:15 + $ doc.saveas(<<<< $ PATH ,$ wdFormatPDF) + CategoryInfo:ParserError:((:String)[],ParentContainsErrorRecordExcept ion + FullyQualifiedErrorId:UnexpectedToken – SuperSub 2012-04-25 15:36:47

+0

我不知道你的實際代碼是否是這樣或不是,但你發佈之間有一個空格。另存爲和() – EBGreen 2012-04-25 15:43:49

+0

該文檔的Word 2010年底說,在默認情況下另存爲應覆蓋現有文件 - '「如果指定文件名的文件已經存在,而無需用戶首先被提示該文件被覆蓋。 「'去圖。 – 2012-04-25 15:49:22

1

試試這個::所以,你簡直像這樣的東西在保存前將其刪除

$word.displayalerts = $false 
$doc.saveas($path, $wdFormatPDF) # with Word2010 I've to use $doc.saveas([ref]$path, [ref]$wdFormatPDF) 
$word.displayalerts = $true 

不會引發錯誤,但我使用Word2010中,我不能與其他版本進行測試

+0

對不起,延遲迴復我離開了。嘗試了application.displayalerts,但得到了以下內容術語'application.displayalerts'不被識別爲cmdlet的名稱,函數 ,腳本文件或可操作程序。檢查名稱的拼寫,或者如果某條路徑包含公司,請驗證路徑是否正確,然後重試。 – SuperSub 2012-04-30 13:55:04

+0

對不起,我的壞貼和複製!現在試試! – 2012-04-30 14:01:10

+0

@SuperSub讓我知道它是否有效。 – 2012-04-30 14:12:14

相關問題