Es wurde versucht, eine große Menge von DOC-Dateien umzubenennen, die auf der ersten Textzeile basieren

2

Ich habe versucht, einem Freund zu helfen, bei dem einige Daten wiederhergestellt wurden, aber die Metadaten gingen verloren. Da es sich meistens um Artikel oder Rezepte handelt, glaubt sie, dass der Titel oder die erste Textzeile für einen Dateinamen ausreichen wird.

Ich wollte versuchen, ein Powershell-Skript zu verwenden, um ... auf die Dateien zuzugreifen / sie zu lesen, die erste Zeile zu greifen (wenn möglich eine Länge von Zeichen zu definieren) und sie dann umzubenennen. Wie ... lesen Sie die ersten 10 Zeichen und benennen Sie die Datei, die.

Ich habe dieses Skript gefunden, das für TXT-Dateien zu sein scheint. Ist es überhaupt möglich, es für .doc zu überarbeiten und dann den Teil über O zu entfernen und es einfach lesen zu lassen, was auch immer die erste Zeile ist, und mit den ersten 10 gelesenen Zeichen umzubenennen?

Jede Hilfe wäre sehr dankbar. (Entschuldigung, wenn ich das Skript falsch geschrieben habe)

$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."
}

}

Ich habe auch dieses Skript gefunden. Das ist mehr .doc konzentriert. Alles, was ich brauche, ist ... lesen Sie die erste Textzeile und benennen Sie sie um (mit einer angemessenen Begrenzung der Zeichen, wie z. B. den ersten 10 Zeichen).

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
stephen
quelle
Ich vermute, dass Sie aufgrund der Breite der Frage und der Tatsache, dass Sie PowerShell nicht von VB unterscheiden können, nicht viel über PowerShell-Skripterstellung wissen ziemlich wichtiges Drehbuch für dich, was ich für eine unrealistische Erwartung halte. Es gibt eine fertige Software, die alles kann, was Sie wollen. Führen Sie eine Google-Suche nach "Word-Dokument basierend auf Inhalt umbenennen" durch.
dangph

Antworten:

0

Kopieren Sie den folgenden Code und erstellen Sie ihn als Powershell-Skript, indem Sie eine Datei mit der Erweiterung .ps1 benennen (getestet mit Powershell 4 unter Windows 7 - überprüfen Sie Ihre Version von Powershell mit "get-host | Select-Object version" oder "$ PSVersionTable.PSVersion").

 $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 #>
Antony
quelle