
Ich wollte einer Freundin helfen, die eine Menge Daten wiederhergestellt hatte, aber die Metadaten verloren hatte. Da es sich bei den meisten um Artikel oder Rezepte handelt, glaubt sie, dass der Titel oder die erste Textzeile oder so als Dateiname ausreichen.
Ich wollte versuchen, mithilfe eines Powershell-Skripts auf die Dateien zuzugreifen/sie zu lesen, die erste Zeile zu erfassen (wenn möglich eine Zeichenlänge festlegen) und sie dann umzubenennen. So wie … die ersten 10 Zeichen zu lesen und die Datei entsprechend umzubenennen.
Ich habe dieses Skript gefunden, das anscheinend für TXT-Dateien gedacht ist. Ist es überhaupt möglich, es für DOC-Dateien umzuarbeiten und dann den Teil über O zu entfernen und es einfach die erste Zeile lesen zu lassen und es mit den gelesenen ersten 10 Zeichen umzubenennen?
Ich wäre für jede Hilfe sehr dankbar. (Entschuldigung, wenn ich das Posten des Skripts vermasselt 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 mehr auf .doc ausgerichtet ist. Alles, was ich brauche, ist ... die erste Textzeile zu lesen und sie umzubenennen (mit einer sinnvollen Begrenzung der Zeichen, 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
Antwort1
Kopieren Sie den folgenden Code und erstellen Sie ihn als Powershell-Skript, indem Sie die Datei mit der Erweiterung .ps1 benennen (getestet mit Powershell 4 unter Windows 7 – überprüfen Sie Ihre Powershell-Version 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 #>