最初の行程度のテキストに基づいて大量の .doc ファイルの名前を変更しようとしています

最初の行程度のテキストに基づいて大量の .doc ファイルの名前を変更しようとしています

私は友人を助けようとしていました。友人は大量のデータを回復しましたが、メタデータが失われていました。そのほとんどが記事やレシピなので、タイトルまたはテキストの最初の行程度がファイル名として十分だと考えています。

PowerShell スクリプトを使用して、ファイルにアクセス/読み取り、最初の行を取得 (可能であれば文字の長さを定義) して、名前を変更したいと考えていました。たとえば、最初の 10 文字を読み取って、そのファイルの名前を変更します。

.txt ファイル用のスクリプトを見つけました。これを .doc 用に作り直し、O の部分を削除して、最初の行を読み取り、最初の 10 文字を読み取って名前を変更することは可能ですか?

どなたか助けていただければ幸いです。(スクリプトの投稿を間違えた場合はお詫び申し上げます)

$myFolderFullOfTextFiles = 'C:\recoveredDocs'
$linesToReadInEachTextFile = 5

$myTextFiles = Get-ChildItem -Path $myFolderFullOfTextFiles

foreach( $textFile in $myTextFiles )
{
$newName = ''

foreach( $line in $(Get-Content -Path $textFile.FullName -Head $linesToReadInEachTextFile) )
{
    if( $line -like 'O*' )
    {
       $newName = $textFile.DirectoryName + '\' + $line.Substring(0,6) + '.txt'
    }
}

try
{
    Write-Host $newName
    Rename-Item -Path $textFile.FullName -NewName $newName
}
catch
{
    Write-Host "Failed to rename $textFile."
}

}

また、このスクリプトも見つけました。これは、.doc に重点を置いたものです。必要なのは、テキストの最初の行を読み取り、名前を変更することだけです (最初の 10 文字など、文字数に適切な上限を設定します)。

Set objWord = CreateObject("Word.Application")
objWord.Visible = True

Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")

strText = objDoc.Paragraphs(1).Range.Text
arrText = Split(strText, vbTab)
intIndex = Ubound(arrText)
strUserName = arrText(intIndex)

arrUserName = Split(strUserName, " ")
intLength = Len(arrUserName(1))
strName = Left(arrUserName(1), intlength - 1)

strUserName = strName & ", " & arrUserName(0)

strText = objDoc.Paragraphs(2).Range.Text
arrText = Split(strText, vbTab)
intIndex = Ubound(arrText)

strDate = arrText(intIndex)
strDate = Replace(strDate, "/", "")

intLength = Len(strDate)
strDate = Left(strDate, intlength - 1)

strFileName = "C:\Scripts\" &  strUserName & " " & strDate & ".doc"

objWord.Quit

Wscript.Sleep 5000

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.MoveFile "C:\Scripts\Test.doc", strFileName

答え1

次のコードをコピーし、拡張子 .ps1 のファイル名を付けて PowerShell スクリプトとして作成します (Windows 7 の PowerShell 4 で問題なくテスト済み - 「get-host|Select-Object version」または「$PSVersionTable.PSVersion」で PowerShell のバージョンを確認してください)。

 $word_app = New-Object -ComObject Word.Application     <# New word application #>
    $source = 'C:\recoveredDocs'    <# create the source variable #>
    $destination = 'C:\renamedDocs' <# create the destination variable #>

    if (!(Test-Path -path $destination)) {  <# check to see if destination folder exists #>
    New-Item -path $destination\ -type directory -Force  } <# create destination folder if it doesn't already exist #>
    echo 'checking files to convert...'

    <# filter for word .doc files only #>
    Get-ChildItem -Path $source -Filter *.doc? | ForEach-Object {
    if (!(Test-Path "$destination\$($_.BaseName).doc")) {   <# check to see if file is already in destination folder (Note. "!" is a PS Alias for "-Not") #>

    $document = $word_app.Documents.Open($_.FullName)   <# open word document #>

    $pattern = '[^a-zA-Z1234567890 ]'   <# create regex pattern of allowed characters #>

    $textstring = $document.range().text <# get the text string from the document #>

    $titlestring = $textstring -replace $pattern, ''    <# apply the regex pattern to eliminate the reserved characters #>

    $title = $titlestring.substring(0, [System.Math]::Min(10, $titlestring.Length)) <# limit the string to 10 characters #>

    $doc_strNewName = "$destination\$($title).doc"  <# create the new name and path for the doc #>

    echo "$($_.FullName) converted to  $doc_strNewName"

$document.SaveAs([ref] $doc_strNewName, [ref] 0)    <# save the document with new name and path #>

$document.Close()   <# close documnet #>

        }
    }

    echo "No More Files to Convert"

$word_app.Quit()    <# close the word application #>

関連情報