2

Я пытался помочь другу, у которого была восстановлена куча данных, но метаданные были потеряны. Поскольку большинство из них - статьи или рецепты, она считает, что заголовок или первая строка текста будут достаточно хороши для имени файла.

Я хотел попробовать использовать скрипт 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 ответ1

0

Скопируйте следующий код и создайте его как сценарий powershell, назвав файл с расширением .ps1 (проверено нормально с powershell 4 в Windows 7 - проверьте свою версию powershell с помощью «get-host | Select-Object version» или «$ PSVersionTable».PSВерсия ")

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .