Скопируйте элементы из папки и добавьте дату к имени файла. Файл не закроется после модификации - PullRequest
0 голосов
/ 08 апреля 2019

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

###Stores the Month and Week###
$Month = Get-Date -UFormat %B
$Date  = Read-Host 'Enter Report Date (M-DD-YY)'

###Sets location of templates###
$Templates = "D:\Templates"

###Set Clients Name Variable###
$client_names = Get-ChildItem $Templates

###Creates shortcut variable for Working directory addresses###
$working_directory = "D:\Reports"
$New_Reports = "D:\Reports\$Date"

###Creates folder for new reports###
New-Item -Name $Date -ItemType directory -Path $working_directory

###Copies all documents in folder to New_Reports folder#####
for ($i=0; $i -lt $client_names.Count; $i++) {
 $client_name = $client_names[$i]
 Get-ChildItem $Templates -Filter *.docx | 
 Foreach-Object {
 $current_template_name = $_.FullName
 Copy-Item -Path $current_template_name -Destination $New_Reports 


  }

}
###Opens each file in New_Reports folder and modifies content#####
for ($i=0; $i -lt $New_Reports.Count; $i++) {
 $New_Report = $New_Reports[$i]
 Get-ChildItem $New_Reports -Filter *.docx | 
Foreach-Object {
 $current_template_name = $_.FullName
 $Doc = OpenWordDoc -Filename $current_template_name
 SearchAWord –Document $Doc -findText '*Date*' -replaceWithText $Date
 SaveAsWordDoc -Document $Doc -FileName $current_template_name

  }

}

Function OpenWordDoc($Filename)

{

$word=NEW-Object –comobject Word.Application

Return $word.documents.open($Filename)

}

Function SearchAWord($Document,$findtext,$replacewithtext)

{ 

$FindReplace=$Document.ActiveWindow.Selection.Find

$matchCase = $false;

$matchWholeWord = $true;

$matchWildCards = $false;

$matchSoundsLike = $false;

$matchAllWordForms = $false;

$forward = $true;

$format = $false;

$matchKashida = $false;

$matchDiacritics = $false;

$matchAlefHamza = $false;

$matchControl = $false;

$read_only = $false;

$visible = $true;

$replace = 2;

$wrap = 1;

$FindReplace.Execute($findText, $matchCase, $matchWholeWord, 
$matchWildCards, $matchSoundsLike, $matchAllWordForms, $forward, $wrap, 
$format, $replaceWithText, $replace, $matchKashida ,$matchDiacritics, 
$matchAlefHamza, $matchControl)

}

Function SaveAsWordDoc ($Document,$FileName)

{

$Document.Saveas([REF]$FileName)

$Document.Close()

}

Скрипт перемещает шаблоны документов Word из папки шаблонов в рабочий каталог, используя введенную мной дату. Я хочу сохранить исходное имя файла, а затем добавить введенную дату ($ Date = 4-8-19).

Исходное имя файла: Document.docx

Новое имя: документ 4-8-19.docx

Затем я изменяю содержимое в документе word, чтобы добавить ту же дату и сохранить файл, но после сохранения документ word не закрывается должным образом и все еще может отображаться в процессе выполнения.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 08 апреля 2019

Таким образом, для переименования мы можем использовать следующее для обновления файлов в вашем $New_Reports пути.

Get-ChildItem $New_Reports -Filter *.docx | Rename-Item -NewName {"{0} {1}{2}" -f ($_.basename, $date, $_.extension)}

Что касается другой проблемы ... Когда я проверял ваш скрипт, я вижув том, что файл закрывается, а в Word нет.Это видно по тому факту, что после вызова SaveAsWordDoc для файла его можно вручную открыть и редактировать в Word.

Чтобы исправить это, вам потребуется quit() из Word.Это может занять несколько секунд, но вы увидите, что он выпадет из ваших запущенных процессов.

Чтобы выполнить это и все еще использовать ваши функции, я обновил OpenWordDoc и SaveAsWordDoc, чтобы сохранить переменную $wordвы уже создали.

Так что теперь OpenWordDoc также возвращает $word ...

Function OpenWordDoc($Filename)

{

$word=NEW-Object –comobject Word.Application

Return $word, $word.documents.open($Filename)

}

А затем функция SaveAsWordDoc принимает $word и выдает quit()когда мы закончим ...

Function SaveAsWordDoc ($word, $Document,$FileName)

{

$Document.Saveas($FileName)

$Document.Close()

$word.quit()

}

Теперь, когда мы вызываем OpenWordDoc для каждого элемента, мы назначаем $word и $Doc

$word, $Doc = OpenWordDoc -Filename $current_template_name

И когда мы сохраняемМы также включаем $word

SaveAsWordDoc -word $word -Document $Doc -FileName $current_template_name

... Кроме этого, у вас есть несколько разделов, которые можно упростить

Копирование файлов можно сократить до одной строки:

###Copies all documents in folder to New_Reports folder#####
Get-ChildItem $Templates -Filter *.docx | Copy-Item -Destination $New_Reports 

И внешний цикл for для открытия каждого файла является избыточным, и этот раздел можно сократить до чего-то вроде:

###Opens each file in New_Reports folder and modifies content#####
Get-ChildItem $New_Reports -Filter *.docx | 
Foreach-Object {
 $current_template_name = $_.FullName
 $word, $Doc = OpenWordDoc -Filename $current_template_name
 SearchAWord –Document $Doc -findText '*Date*' -replaceWithText $Date
 SaveAsWordDoc -word $word -Document $Doc -FileName $current_template_name
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...