我有两个问题。第一个问题是在文件名移动后在文件名后附加一个日期,第二个问题是在文档中进行更改后的结尾词。
###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文档无法正确关闭,并且仍可以在运行过程中看到。
任何帮助将不胜感激。
答案 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