首页 > 解决方案 > 用于将 .csv 转换为 .html 并处理多个文件的 Powershell 脚本

问题描述

我必须编写一个脚本来获取多个 .csv 文件的内容并将它们写入一个 .html 文件。目标是将所有文件名视为按钮,并能够展开按钮以查看内容。

我的问题是我不知道如何为每个文件提供正确的名称data-targetdiv id

我想你现在已经知道我的脚本技能......非常非常有限,但这是我的尝试:

$in = "C:\clientlist\*"
$out = 'C:\clientlist\test.html'

$head = @"
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
"@
$Pre = @"
<div class="container">
<h2></h2>
<button type="button" class="btn btn-info" data-toggle="collapse" data-target="#demo">Filename</button>
<div id="demo" class="collapse">
"@
$Post = @"
</p></div>
"@
$Head | Out-File -filepath $out
$List = Get-ChildItem $in -Filter *.csv
$User =  $List |
ForEach-Object {Import-Csv $_ | Select-Object | convertto-html -fragment -precontent $pre -postcontent $post}
$User | Out-File -filepath $out -append

任何帮助将不胜感激,如果您需要任何进一步的信息,请告诉我!

标签: javascripthtmljquerypowershell

解决方案


你很近!
您需要做的是$Pre在 ForEach-Object 循环中定义字符串。Select-Object除非您想选择要输出的 CSV 数据的子集,否则您在两者之间所做的一切都没有用。

这样的事情应该这样做:

$Head | Out-File -filepath $out -Encoding utf8
$List = Get-ChildItem $in -Filter *.csv -File | ForEach-Object {
    $name = $_.BaseName
    $id = '{0}_{1}' -f $name, (Get-Date).Ticks  # to make this id unique, append the Ticks to the name

    $Pre = @"
<div class="container">
<h2></h2>
<button type="button" class="btn btn-info" data-toggle="collapse" data-target="#$id">$name</button>
<div id="$id" class="collapse">
"@
    $Post = '</p></div>'
    Import-Csv -Path $_.FullName | ConvertTo-Html -Fragment -PreContent $pre -PostContent $post | 
    Out-File -FilePath $out -Encoding utf8 -Append
}

另一种方法是创建包含占位符和的$Preas 模板,并使用Format 运算符在 ForEach 循环中填写名称和 id :{0}{1}-f

$Head | Out-File -filepath $out -Encoding utf8

$Pre = @'
<div class="container">
<h2></h2>
<button type="button" class="btn btn-info" data-toggle="collapse" data-target="#{0}">{1}</button>
<div id="{0}" class="collapse">
'@
$Post = '</p></div>'

$List = Get-ChildItem $in -Filter *.csv -File | ForEach-Object {
    $name = $_.BaseName
    $id = '{0}_{1}' -f $name, (Get-Date).Ticks  # to make this id unique, append the Ticks to the name
    # use the $Pre template to fill in the placeholders
    $precontent = $Pre -f $id, $name

    Import-Csv -Path $_.FullName | ConvertTo-Html -Fragment -PreContent $precontent -PostContent $post | 
    Out-File -FilePath $out -Encoding utf8 -Append
}

推荐阅读