我正在尝试创建一个读取XML文件的 powershell 程序,并将数据存储到excel文件中以更有效地分析它。所以我可以毫无问题地打开文档,读取XML并在CSV中写入没有任何问题。但是当用户启动他的程序时,我想向他显示剩余的行数百分比。
这是我的代码:
$Packages = $xdoc.DataProfile.DataProfileOutput.Profiles.ColumnValueDistributionProfile
$PackageNumber = $Packages.Count
# --- For each couple, get the table name, the number of rows, the name of the field, and the number of different values existing in each fields --- #
$i = 0
while($i -ne $PackageNumber){
$state = $i/$PackageNumber * 100
$state = [math]::floor($state)
Write-Host $state "of 100 %"
# Here are commands to get infos about the content of the xml
$j = 0
while($j -lt $ItemNumber){
$Value = #value in the xml ..
$Count = #number of the row in the xml ..
# --- If the number of rows in the fields is different from 0, calculate the purcentage for each value and add it to the CSV --- #
if($table_rows -ne 0){
$Purcentage = $Count / $table_rows * 100
$csv_content = $table_name + ";" + $table_field + ";" + $table_rows + ";" + $Value + ";" + $Count + ";" + $Purcentage
ADD-content -path $csv_file -value $csv_content
}
$j++
}
$i++
}
这样,我可以计算总行数和缓冲区正在读取的行数。通过简单的划分,我获得百分比。
但结果是:
50 of 100 %
50 of 100 %
....
50 of 100 %
51 of 100 %
51 of 100 %
....
51 of 100 %
我如何为每个百分比值获得只有一行,而不是像下面那么多?
50 of 100 %
51 of 100 %
52 of 100 %
答案 0 :(得分:1)
想出了这样做的想法。在您的脚本中,添加行$oldState = 0
,为我们提供基线百分比。
然后,在您的主脚本块中,在此行$state = [math]::floor($state)
下方,添加以下内容:
if ($state -ne $oldState){
Write-Host $state "of 100 %"
$oldState = $state
}
最终结果将是比较以查看当前状态是否与写入屏幕的最后$state
相同。如果不是,那么我们会写入百分比并为州设置新值。
答案 1 :(得分:0)
可能有更好的方法,但首先想到的是获取文件中的所有行,除了最后一行然后附加百分比。在这个例子中,我在文件末尾添加了一行,以确保我没有删除重要信息。
'asdf' > C:\temp\test.txt
' ' >> C:\temp\test.txt
0..100 | % {
sleep 1
$file = Get-Content 'C:\temp\Test.txt'
$file = $file[0..$($file.Count-2)]
$file += "$_%"
$file > C:\temp\test.txt
Get-Content C:\temp\test.txt
}