2017-09-25 45 views
1

フォルダ内を移動し、フォルダ内のすべての単語文書を取得してハイパーリンクを検索するスクリプトを作成する方法を理解しようとしていますリンクを別のリンクに変更します。次に、その単語の文書を保存するだけでなく、pdfに変換する別のバージョンを作成します。Wordでハイパーリンクを見つけて変更するPowershellスクリプト

フォルダー内のすべての単語文書を取得し、すべてのハイパーリンクを「https://www.yahoo.com」から「https://www.google.com」に検索するためにスクリプトを調整するにはどうすればよいですか。すべてのハイパーリンクを介して検索する文書全体をどのようにループするか。その文書を保存し、変換して新しいpdfを与えます。

これは可能ですか?私が持っているもの

は、これまで

$word = New-Object -ComObject word.application 
     $document = $word.documents.open("path to folder") 
     $hyperlinks = @($document.Hyperlinks) 
     $hyperlinks | ForEach { 
      $newURI = ([uri]$_.address).AbsoluteUri 
      Write-Verbose ("Updating {0} to {1}" -f $_.Address,$newURI) -Verbose 
      $_.address = $newURI 
     } 
     If (_$.address -eq "https://www.yahoo.com/") { 
      $_.Address = "https://www.google.com/" 
     } ElseIf ($_.Address -eq "http://def.com/motorists") { 
      $_.Address = "http://hij.com/" 
     } 
     $document.save() 
     $word.quit() 

    Get-ChildItem -Path $document -Include *.doc, *.docx -Recurse | 
     ForEach-Object { 
      $doc = $word.Documents.Open($_.Fullname) 
      $pdf = $_.FullName -replace $_.Extension, '.pdf' 
      $doc.ExportAsFixedFormat($pdf,17) 
      $doc.Close() 
     } 
    $word.Quit() 

私は誰かが助けてくださいこうした工程を経て、私を歩いていくのPowerShellに新しいです。私はpowershellがおそらくこの種のことを成し遂げるための最強かつ最強の言語だと聞きます。

答えて

3

これは以前には行われていなかったので、それを理解するのはいいことでした。私たちは今日一緒に学びます!あなたはとても近くにいた。ちょうどいくつかの調整と、複数のファイルを扱うためのループが必要でした。私はもっ​​と精通した人が落ちるだろうと確信していますが、これはあなたに望ましい結果をもたらすはずです。

$NewDomain1 = "google" 
$NewDomain2 = "hij" 
$OurDocuments = Get-ChildItem -Path "C:\Apps\testing" -Filter "*.doc*" -Recurse 

$Word = New-Object -ComObject word.application 
$Word.Visible = $false 

$OurDocuments | ForEach-Object { 
    $Document = $Word.documents.open($_.FullName) 
    "Processing file: {0}" -f $Document.FullName 
    $Document.Hyperlinks | ForEach-Object { 
     if ($_.Address -like "https://www.yahoo.com/*") { 
      $NewAddress = $_.Address -Replace "yahoo","google" 
      "Updating {0} to {1}" -f $_.Address,$NewAddress 
      $_.Address = $_.TextToDisplay = $NewAddress 
     } elseif ($_.Address -like "http://def.com/*") { 
      $NewAddress = $_.Address -Replace "def","hij" 
      "Updating {0} to {1}" -f $_.Address,$NewAddress 
      $_.Address = $_.TextToDisplay = $NewAddress 
     } 
    } 

    "Saving changes to {0}" -f $Document.Fullname 
    $Document.Save()  

    $Pdf = $Document.FullName -replace $_.Extension, '.pdf' 
    "Saving document {0} as PDF {1}" -f $Document.Fullname,$Pdf 
    $Document.ExportAsFixedFormat($Pdf,17) 

    "Completed processing {0} `r`n" -f $Document.Fullname 
    $Document.Close() 
} 

$Word.Quit() 

私たちは、最初の将来の参照や変更を容易にするための変数のカップルにあなたの新しいアドレスを移動します

...さんはそれを見てみましょう。探しているアドレスを追加して、必要に応じてハードコードされた文字列を置き換えることもできます。 3行目では、フィルタを使用してディレクトリ内のすべての.DOCファイルと.DOCXファイルを取得します。これを繰り返し処理に使用します。個人的には、-Recurseスイッチを使用することに注意してください。ディレクトリ構造のファイルを意図せずに変更する危険性があります。

$NewAddress1 = "https://www.google.com/" 
$NewAddress2 = "http://hij.com/" 
$OurDocuments = Get-ChildItem -Path "C:\Apps\testing" -Filter "*.doc*" -Recurse 

Word Comオブジェクトをインスタンス化し、表示しないようにします。

$Word = New-Object -ComObject word.application 
$Word.Visible = $false 

我々は$OurDocumentsに集まった各文書について...当社ForEach-Objectループに

ステッピング、我々はAddressプロパティの値をチェックし、別のForEach-Object、へのハイパーリンクを、それを開いて、パイプ。必要な一致がある場合は、新しい値でプロパティを更新します。 TextToDisplayのプロパティも更新されています。 Addressとは対照的に、ハイパーリンクの実際の位置を制御します。

... $_.Address = $_.TextToDisplay = $NewAddress1 ...多変数割り当ての例です。 AddressTextToDisplayは同じ値に設定されるため、同時に割り当てます。ここで作られた

$Document = $Word.documents.open($_.FullName) 
"Processing file: {0}" -f $Document.FullName 
$Document.Hyperlinks | ForEach-Object { 
    if ($_.Address -like "https://www.yahoo.com/*") { 
     $NewAddress = $_.Address -Replace "yahoo","google" 
     "Updating {0} to {1}" -f $_.Address,$NewAddress 
     $_.Address = $_.TextToDisplay = $NewAddress 
    } elseif ($_.Address -like "http://def.com/*") { 
     $NewAddress = $_.Address -Replace "def","hij" 
     "Updating {0} to {1}" -f $_.Address,$NewAddress 
     $_.Address = $_.TextToDisplay = $NewAddress 
    } 
} 

保存の変更...

"Saving changes to {0}" -f $Document.Fullname 
$Document.Save()  

は、我々はPDFとして保存するときのために新しいファイル名を作成します。最初の行には$_.Extensionという通知があります。現在のパイプラインオブジェクトは依然としてGet-ChildItemのファイル情報オブジェクトなので、ファイル拡張子を参照するためにパイプラインオブジェクトを使用することに切り替えます。 $Documentオブジェクトには拡張プロパティがないため、同じ結果を得るにはファイル名をスライスする必要があります。

$Pdf = $Document.FullName -replace $_.Extension, '.pdf' 
"Saving document {0} as PDF {1}" -f $Document.Fullname,$Pdf 
$Document.ExportAsFixedFormat($Pdf,17) 

はアップ文書を閉じて、ループが$OurDocumentsに次のファイルに移動します。

"Completed processing {0} `r`n" -f $Document.Fullname 
$Document.Close() 

すべてのドキュメントを実行したら、Wordを閉じます。

$Word.Quit() 

私はすべてが意味をなさないことを願っています!

+0

これは、リンクの残りの部分を同じように維持するリンクの一部だけで検索を実行しようとしていることを除いて、非常に近いです。 –

+0

TLDを更新するだけですか?簡単に行うことができます。あなたは本質的に '$ NewAddress = $ OldAddress -Replace" yahoo "、" google "'のようなことをしています。アドレスの他のすべての部分が同じままであると仮定すると、それはです。私は一瞬で答えにそれを投げようとします。 – mroloff

+1

変更が加えられ、テストのために機能しています。 '$ _。Address -eq'は文字列の最後にアスタリスクを付けた' $ _。Address-like'になりました。 '$ NewAddress = $ _。Address - " yahoo "、" google "はドメイン名を_only_に置き換えて新しいアドレスを生成します。ファイルを検索するのに必要なだけのものを調整するのは簡単です。 – mroloff

関連する問題