PowerShell - недопустимые символы в пути сохранения
Я уверен, что в этом сценарии есть много неправильных вещей, но сейчас единственное, что вызывает какие-либо ошибки, - это часть SaveImage. Итак, скрипт будет извлекать результаты из MySql Queries и использовать эту информацию для создания диаграмм. За исключением того, что он не будет сохранять графики.
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")
$scriptPath = "C:\Users\Public\reports\img"
Connect-MySqlServer -ComputerName [SERVER] -Port 3306 -Database [DB] -Credential (Get-Credential)
$locations = Invoke-MySqlQuery "[...]"
ForEach ($location in $locations) {
$loc = $location.locationID
$dataSource = Invoke-MySqlQuery "[...]"
$c = (Invoke-MySqlQuery "[...]").name | Out-String
$s = (Invoke-MySqlQuery "[...]").name | Out-String
$chart1 = New-Object System.Windows.Forms.DataVisualization.Charting.Chart
$chart1.Width = 600
$chart1.Height = 400
$chart1.BackColor = [System.Drawing.Color]::White
[void]$chart1.Titles.Add("Test Chart")
$chart1.Titles[0].Font = "Segoe UI,13pt"
$chart1.Titles[0].Alignment = "topLeft"
$chartArea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartArea.Name = "ChartArea1"
$chartArea.AxisY.Title = "Y Axis"
$chartArea.AxisX.Title = "X Axis"
$chartArea.AxisY.Interval = 5
$chartArea.AxisX.Interval = 1
$chartArea.AxisY.MaximumAutoSize = $false
$chartArea.AxisX.MaximumAutoSize = $false
$chartArea.AxisY.Maximum = 80
$chartArea.AxisX.Maximum = 30
$chart1.ChartAreas.Add($chartArea)
$legend = New-Object System.Windows.Forms.DataVisualization.Charting.Legend
$legend.Name = "Legend1"
$chart1.Legends.Add($legend)
[void]$chart1.Series.Add("U")
$chart1.Series["U"].ChartType = "Line"
$chart1.Series["U"].BorderWidth = 3
$chart1.Series["U"].IsVisibleInLegend = $True
$chart1.Series["U"].ChartArea = "ChartArea1"
$chart1.Series["U"].Legend = "Legend1"
$chart1.Series["U"].Color = "#7CB5EC"
ForEach ($point in $dataSource) {$chart1.Series["U"].Points.addxy($($point.t),[math]::Round(($point.u) / 1024),2))}
[void]$chart1.Series.Add("D")
$chart1.Series["D"].ChartType = "Line"
$chart1.Series["D"].BorderWidth = 3
$chart1.Series["D"].IsVisibleInLegend = $True
$chart1.Series["D"].ChartArea = "ChartArea1"
$chart1.Series["D"].Legend = "Legend1"
$chart1.Series["D"].Color = "#FFA500"
ForEach ($point in $dataSource) {$chart1.Series["D"].Points.addxy($($point.t),[math]::Round(($($point.d) / 1024),2))}
$filename = $scriptPath + "\" + ($c).replace(" ","") + "_" + ($s).replace(" ","") + ".png"
$filename = ($filename).replace("`n","")
$chart1.SaveImage("$filename","png")
}
Это возвращает:
Exception calling "SaveImage" with "2" argument(s): "Illegal characters in path."
At line:62 char:1
+ $chart1.SaveImage("$filename","png")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException
Я предполагаю, что это как-то связано с Out-String
используется с $c
а также $s
Запросы, но когда я не делаю этого, у меня возникают другие проблемы. А также $filename
без .replace
возвращает:
C:\Users\Public\reports\img\$c
_$s
.png
Итак, я использовал следующее, чтобы проверить $filename
для недопустимых символов:
$pattern = "[{0}]" -f ([Regex]::Escape([String][System.IO.Path]::GetInvalidFileNameChars() -join '' ))
$filename -match $pattern
$matches
Который возвращает:
True
Name Value
---- -----
0 :
Когда я cd
в каталог и попытайтесь сохранить файл как $filename
без $scriptPath
, чтобы избавиться от ":" после буквы диска, я получаю следующее $matches
:
Name Value
---- -----
0 ...
Итак, я в полном недоумении. Если у кого-то есть понимание, я буду очень признателен.
1 ответ
Установить переменную с именем файла, очистить его и использовать
$fn = ($c).replace(" ","") + "_" + ($s).replace(" ","") + ".png"
$fp = $scriptPath + "\" + ($f -replace ("[{0}]" -f [RegEx]::Escape([IO.Path]::GetInvalidFileNameChars() -join '')))
$chart1.SaveImage($fp,"png")