【发布时间】:2021-03-18 20:03:12
【问题描述】:
我想格式化使用 Powershell 生成的 .st(文本)文件中的特定行。
- 加载 TextSnippet 以供演示使用 ($TemplateSnippetText)
- 替换一些文本
- 将文本行与“:=”对齐,以便所有“:=”都在一行中(如 $TemplateSnippetText)
我正在为格式化而苦苦挣扎,可能是数学问题......? 可以使用 String.Format("{0,6} {1,15}) 方法完成吗?
期望的输出
diMoveStep_TFRX := 1;
ELSE // Bewegung vorbereiten
diMoveStep_TFRX := 0;
END_IF
END_IF
// Schrittkette Bewegung
CASE diMoveStep_TFRX OF
0: // Bewegung vorbereiten
fbAxis_TFRX.i_stCmd.xMoveAbsolute := FALSE;
diMoveStep_TFRX := 1;
1: // Bewegung starten
IF stPos.stTFRX.stPickPos1.xEnMove THEN
fbAxis_TFRX.i_stPar.stMove := stMovePar_TFRX;
fbAxis_TFRX.i_stPar.lrPosition := stDataProduct.stTFRX.lrPos_PickPos1;
strPickPos1_TFRX := 'PickPos1';
fbAxis_TFRX.i_stCmd.xMoveAbsolute := TRUE;
diMoveStep_TFRX := 2;
END_IF
2: // Bewegung ist gestartet
实际输出
IF NOT fbAxis_TFRX.i_stCmd.xMoveAbsolute THEN // Bewegung starten
diMoveStep_TFRX := 1;
ELSE // Bewegung vorbereiten
diMoveStep_TFRX := 0;
END_IF
END_IF
// Schrittkette Bewegung
CASE diMoveStep_TFRX OF
0: // Bewegung vorbereiten
fbAxis_TFRX.i_stCmd.xMoveAbsolute := FALSE;
diMoveStep_TFRX := 1;
1: // Bewegung starten
IF stPos.stTFRX.stPickPos1.xEnMove THEN
fbAxis_TFRX.i_stPar.stMove := stMovePar_TFRX;
fbAxis_TFRX.i_stPar.lrPosition := stDataProduct.stTFRX.lrPos_PickPos1;
strPickPos1_TFRX := 'PickPos1';
fbAxis_TFRX.i_stCmd.xMoveAbsolute := TRUE;
diMoveStep_TFRX := 2;
END_IF
2: // Bewegung ist gestartet
完整的 Powershell 5.1 代码:
$TemplateSnippetText =
"ACTION ActAuto_Move_AXISNAME_TARGETPOS: // COMMENT
// Rücksetzen
IF NOT stStep.xEntryDone THEN
IF NOT fbAxis_AXISNAME.i_stCmd.xMoveAbsolute THEN // Bewegung starten
diMoveStep_AXISNAME := 1;
ELSE // Bewegung vorbereiten
diMoveStep_AXISNAME := 0;
END_IF
END_IF
// Schrittkette Bewegung
CASE diMoveStep_AXISNAME OF
0: // Bewegung vorbereiten
fbAxis_AXISNAME.i_stCmd.xMoveAbsolute := FALSE;
diMoveStep_AXISNAME := 1;
1: // Bewegung starten
IF stPos.stAXISNAME.stTARGETPOS.xEnMove THEN
fbAxis_AXISNAME.i_stPar.stMove := stMovePar_AXISNAME;
fbAxis_AXISNAME.i_stPar.lrPosition := stDataProduct.stAXISNAME.lrPos_TARGETPOS;
strTargetPos_AXISNAME := 'TARGETPOS';
fbAxis_AXISNAME.i_stCmd.xMoveAbsolute := TRUE;
diMoveStep_AXISNAME := 2;
END_IF
2: // Bewegung ist gestartet
IF fbAxis_AXISNAME.q_stStat.xMoveDone AND
stPos.stAXISNAME.stTARGETPOS.xInRange THEN
fbAxis_AXISNAME.i_stCmd.xMoveAbsolute := FALSE;
stStep.xActDone := TRUE;
diMoveStep_AXISNAME := 3;
END_IF
3: // Bewegung ist beStringEndt
;
END_CASE
// Stop deaktivieren während der Bewegung
stStep.enStopMode := SEL(fbAxis_AXISNAME.i_stCmd.xMoveAbsolute, EnableStop, DisableStop);
END_ACTION
"
#Dateipfad
$strFilePath = 'C:\Temp\CodeSnippet.st'
$RegPatRepWhiteSpaces = '\s+?(?=:=)' # https://regex101.com/r/IEiymN/1
$RegPatStartOfString = '^.*?(?=:=)' # https://regex101.com/r/icJGAy/1
$RegPatEndOfString = ':=(.*)' # https://regex101.com/r/0UlzT7/1
# File-Inhalt löschen
Remove-Item $strFilePath -Include *.st
$SnippetsToGenerate = @(
[PSCustomObject]@{COMMENT = 'Zielposition1'; AXISNAME = 'TFRX'; TARGETPOS = 'PickPos1' }
# [PSCustomObject]@{COMMENT = 'Zielposition2'; AXISNAME = 'TFRX'; TARGETPOS = 'PickPos2' }
#[PSCustomObject]@{COMMENT = 'Zielposition3'; AXISNAME = 'TFRX'; TARGETPOS = 'PickPos3' }
)
$SnippetsToGenerate | ForEach-Object {
$CurrentSnippet = $TemplateSnippetText
$CurrentSnippet = $CurrentSnippet -replace "COMMENT", $_.COMMENT -replace "AXISNAME", $_.AXISNAME -replace "TARGETPOS", $_.TARGETPOS
$CurrentSnippet | Out-File -FilePath $strFilePath -Append
}
(Get-Content -Path $strFilePath -Raw) -Replace $RegPatRepWhiteSpaces,'' | Set-Content -Path $strFilePath
$IndexOfAllocation = Get-Content -Path $strFilePath | ForEach-Object {$_.IndexOf(":=") } | Measure-Object -Maximum
(Get-Content -Path $strFilePath) | ForEach-Object {
$currentObject = $_
if($currentObject -match ':='){
$StringStart = [Regex]::Matches($currentObject, $RegPatStartOfString).Value
$StringEnd = [Regex]::Matches($currentObject, $RegPatEndOfString ).Value
Write-Host "Lenght StringStart" $StringStart.Length"Lenght StringEnd" $StringEnd.Length
Write-host "Max" $IndexOfAllocation.Maximum
[uint32]$DiffToPaddAbsolute = ($IndexOfAllocation.Maximum - $StringStart.Length)
#if (($DiffToPaddAbsolute % 4) -gt 2) {
$DiffToPaddAbsoluteTabs = [math]::Ceiling($DiffToPaddAbsolute / 4) + 1
# } else {
#$DiffToPaddAbsoluteTabs = [math]::Floor($DiffToPaddAbsolute / 4) + 1
#}
$StringStartPadded= $StringStart.PadRight($StringStart.Length + $DiffToPaddAbsoluteTabs,[char]9)
$currentObject = "$StringStartPadded$StringEnd"
}
$currentObject
} | Set-Content -Path $strFilePath
Invoke-Item $strFilePath
【问题讨论】:
-
如果您提供示例输入和所需输出,我们会帮助您。
标签: powershell string-formatting