【发布时间】:2017-03-17 02:24:34
【问题描述】:
我正在尝试获取具有扩展名“.rtf”的目录中的所有文件。我有一个工作脚本,但这需要一段时间,因为在 foreach 循环中有一个 foreach 循环。有没有更快的方法来处理这个?该脚本的目标是获取以 .rtf 结尾的目录中的所有文件,并使用 MSWord 打开文件并将其保存为“.DOC”。转换功能工作正常。问题在于搜索所有文件夹的时间长度。
Function Convert-Dir($path)
{
$subFolders = get-childitem $path -Recurse | Where-Object {$_.PSIsContainer -eq $True}
if($subFolders)
{
foreach($folder in $subFolders)
{
if($folder.PSisContainer)
{
$Files=Get-ChildItem $folder.fullname -Filter "*.rtf"
$Word=New-Object -ComObject WORD.APPLICATION
if($Files)
{
foreach ($File in $Files)
{
$Doc=$Word.Documents.Open($File.fullname)
$Name=($Doc.name).replace("rtf","doc")
if (Test-Path $Name)
{
} else
{
# Use WORD
$fullName = ($Doc.path + "\" + "Converted_" + $Name)
$Doc.saveas([ref] $fullName, [ref] 0)
$Doc.close()
$fileToRemove = $File.fullName
Remove-Item $fileToRemove
$Word.Quit()
}
}
}
}
}
}
}
【问题讨论】:
-
$subfolders 的实例化是否还没有通过所有目录递归地获取所有文件?此外,是否有任何理由打开 word 将文档从 .rtf 更改为 .doc?您可以使用 Rename-Item 命令更改文件扩展名。
-
我会尝试这样的开始。 get-childitem $path -Recurse | % {if($_.Name -contains '.rtf'){ Rename-Item -Path $_.FullName -NewName \somepath\whatever new name is}}
-
@jdwal 之所以使用word打开保存,是因为word这样做的时候,实际上是把文件从RTF转为DOC。更改文件扩展名并不会真正转换代码。
-
@jdwal 似乎它正在递归地进行,而不需要额外的 foreach 循环。感谢那。但是,我真的宁愿它不修改第一个目录中的文件。基本上,.rtf 文件都位于根据用户姓名首字母命名的子目录中。所以有一个主目录,然后是许多子文件夹,用户名的首字母(BHO、NAC 等)。我只想转换子文件夹文件,而不是主目录(调用脚本的地方)。我可以在 powershell 中检查路径末尾的长度吗?
-
我没有时间尝试这个,但可能是 .rtf 文件上的获取内容,并将管道中的输出文件设置为 .doc。您也许可以将 Encoding 属性设置为您喜欢的任何一个。
标签: loops powershell scripting filesystems