从文件夹复制项目,并将日期附加到文件名。修改后文件不会关闭

时间:2019-04-08 18:04:21

标签: powershell

我有两个问题。第一个问题是在文件名移动后在文件名后附加一个日期,第二个问题是在文档中进行更改后的结尾词。

###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文档模板从template文件夹移动到工作目录。我想保留原始文件名,然后附加我输入的日期($ Date = 4-8-19)。

原始文件名:Document.docx

新名称:Document 4-8-19.docx

然后,我修改word文档中的内容以添加相同的日期并保存文件,但是保存后word文档无法正确关闭,并且仍可以在运行过程中看到。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

因此,要进行重命名,我们可以使用以下内容来更新您的$New_Reports路径中的文件。

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

关于其他问题...当我测试您的脚本时,我看到的是文件正在关闭,而Word却没有。事实证明,一旦SaveAsWordDoc被调用为文件,就可以在Word中手动打开它并对其进行编辑。

要解决此问题,您需要{@ {1}}从Word。可能要花几秒钟,但是您会看到它从正在运行的进程中消失。

为了完成此操作并仍然使用您的功能,我更新了quit()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