更有效的方法是从多个文件中逐个提取行,然后在powershell中从中合成新文件

更有效的方法是从多个文件中逐个提取行,然后在powershell中从中合成新文件,powershell,Powershell,我正在尝试从5个文件中生成视频站点地图,其中我有不同部分的站点地图信息。我想到的唯一方法是在每个文件的循环中跳过一行,然后将下一行添加到目标文件中,但这需要很长时间才能在10分钟内完成,因为每个文件中有超过3k行。每个文件中的所有行都彼此对齐,因此必须根据行号将它们分组在一起 以下是我使用的代码: # Count Number Of Lines $NumberOfVideos = 0 Get-Content "c:/list_of_links_with_YT_video.txt" |%{ $Nu

我正在尝试从5个文件中生成视频站点地图,其中我有不同部分的站点地图信息。我想到的唯一方法是在每个文件的循环中跳过一行,然后将下一行添加到目标文件中,但这需要很长时间才能在10分钟内完成,因为每个文件中有超过3k行。每个文件中的所有行都彼此对齐,因此必须根据行号将它们分组在一起

以下是我使用的代码:

# Count Number Of Lines
$NumberOfVideos = 0
Get-Content "c:/list_of_links_with_YT_video.txt" |%{ $NumberOfVideos++ }

# Add lines to the sitemap 1 by 1
For($i=1;$i -le $NumberOfVideos;$i++){
    ' <url>' | Add-Content $outputfolder\videositemap.xml
    Get-Content "c:/list_of_links_with_YT_video.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml
    "  <video:video>" | Add-Content $outputfolder\videositemap.xml
    Get-Content "c:/listof_YT_Embeds.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml
    Get-Content "c:/listof_YT_Thumbnailss.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml
    Get-Content "c:/list_of_video_sitemap_titles.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml
    Get-Content "c:/list_of_video_sitemap_descriptions.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml
    ' </video:video>
 </url>' | Add-Content $outputfolder\videositemap.xml
}

# Add last line to the sitemap
"</urlset>" | Add-Content $outputfolder\videositemap.xml
这是1次循环后站点地图文件中的内容示例:

<url>
 <loc>http://mywebsite.com/page-example.html</loc>
  <video:video>
  <video:player_loc allow_embed="yes" autoplay="autoplay=1">http://www.youtube.com/v/xu3Je-eJgbR</video:player_loc>
  <video:thumbnail_loc>http://img.youtube.com/vi/xu3Je-eJgbR/1.jpg</video:thumbnail_loc>
  <video:title>Example Title Extracted From a HTML File</video:title>
  <video:description>Example Description Extracted From A HTML File</video:description>
 </video:video>
</url>
有没有更好的方法从多个文件中组合出一个文件

输入文件的内容永远不会更改,因此每个文件使用一次“获取内容” Get Content返回具有Count属性的集合 输出文件从不更改,请将其存储在变量中 与$Path\$filename不同,Join Path是一种很好的做法 我不习惯添加内容,所以我使用了File-Append,但我想这只是口味的问题 这将产生您想要的:

$file1Lines = Get-Content "c:/list_of_links_with_YT_video.txt"
$file2lines = Get-Content "c:/listof_YT_Embeds.txt"
$file3lines = Get-Content "c:/listof_YT_Thumbnailss.txt"
$file4lines = Get-Content "c:/list_of_video_sitemap_titles.txt"
$file5lines = Get-Content "c:/list_of_video_sitemap_descriptions.txt"

$videoCount = ($file1Lines).Count
$outputFile = Join-Path $outputfolder "videositemap.xml"

#thought this was missing
"<urlset>" | Out-File $outputFile -Append

for($i = 1; $i -le $videoCount; $i++) {

#no indentation here to avoid indentation in the output string
" <url>
  $($file1Lines[$i])
  <video:video>
   $($file2Lines[$i])
   $($file3Lines[$i])
   $($file4Lines[$i])
   $($file5Lines[$i])
  </video:video>
 </url>" | Out-File $outputFile -Append

}

"</urlset>" | Out-File $outputFile -Append
我很想看到速度的提高


编辑:在你的源文件中有双引号,我希望这不会破坏我的脚本:

哇,你是我的好朋友!您的代码大约需要4秒钟才能完成!谢谢!