Metnin ilk satırını temel alarak büyük miktarda .doc dosyasını yeniden adlandırmayı denemek


2

Bir sürü veriyi toparlayan bir arkadaşa yardım etmeye çalışıyordum, ancak meta veriler kayboldu. Çoğu makale veya tarif olduğu için, metnin başlığının ya da ilk satırının ya da bir kısmının bir dosya adı için yeterince iyi olacağına inanıyor.

Dosyalara erişmek / okumak, bir ilk satırı kapmak (mümkünse bir karakter uzunluğu tanımlamak) ve sonra yeniden adlandırmak için bir powershell betiği kullanmayı denemek istedim. Gibi ... ilk 10 karakteri oku ve o dosyayı yeniden adlandır.

.Txt dosyaları için görünen bu betiği buldum. .Doc için yeniden işleme koymak ve sonra O ile ilgili kısmı ortadan kaldırmak ve ilk satırın ne olduğunu okumak ve ilk 10 karakterin okunması ile yeniden adlandırmak mümkün mü?

Herhangi bir yardım çok takdir edilecektir. (betiğin gönderilmesini alamazsam özür dilerim)

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

}

Ayrıca bu senaryoyu da buldum. bu daha fazla odaklanmıştır. İhtiyacım olan tek şey ... ilk satırın ne olduğunu okumak, yeniden adlandırmak (ilk 10 karakter gibi karakterlerde bazı makul başlıklar ile).

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

Sorunun genişliğine ve VB’den PowerShell’e söyleyemediğiniz gibi göründüğü gerçeğine dayanarak PowerShell komut dosyası hakkında pek bir şey bilmediğinizi tahmin ediyorum. gerçekçi olmayan bir beklenti olduğunu düşünüyorum, sizin için oldukça önemli bir senaryo. İstediğinizi yapabilen hazır bir yazılım var. "İçeriğe dayalı kelime belgesini yeniden adlandır" için bir Google araması yapın.
dang

Yanıtlar:


0

Aşağıdaki kodu kopyalayın ve .ps1 uzantılı dosyayı adlandırarak powershell betiği olarak oluşturun (Windows 7'de powershell 4 ile test edildi - powershell sürümünüzü "get-host | Select-Object sürümü" veya "$ PSVersionTable.PSVersion" ile kontrol edin)

 $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 #>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.