【问题标题】:Powershell search through folders and sub folder for files with ".rtf" extensionPowershell 在文件夹和子文件夹中搜索带有“.rtf”扩展名的文件
【发布时间】: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


【解决方案1】:

我猜想通过在每个子文件夹中调用一个文字处理来创建大量文字实例会损失性能。您应该始终只使用一个单词实例。只需将$Word=New-Object -ComObject WORD.APPLICATION 行移动到函数的顶部,将$word.quit() 行移到最后。

【讨论】:

    猜你喜欢
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多