PowerShell удаляет все комментарии из скрипта - PullRequest
0 голосов
/ 02 апреля 2020

Я ищу способ удалить все комментарии из файла. Есть различные способы сделать комментарии, но меня интересуют только простые # комментарии формы. Причина в том, что я использую <# #> только для функции .SYNOPSIS, которая является функциональным кодом, а не просто комментарием, поэтому я хочу оставить их).

РЕДАКТИРОВАТЬ: Я обновил этот вопрос используя ответы ниже или, возможно, с пробелами раньше, т. е. регулярное выражение ^\s*#, кажется, работает.

b) с некоторым кодом в начале строки, а затем с командой в конце строки. Я хочу избежать удаления строк, например, Write-Host "#####", но я думаю, что это отражено в моем коде.

Мне удалось удалить комментарии в конце строки с разделением, так как я не смог узнать, как это сделать с помощью регулярных выражений, кто-нибудь знает способ достичь этого с помощью регулярных выражений?

Разделение не было идеальным, поскольку <# на линии удалялось бы -split, но я исправил это, разделив на " #". Это не идеально, но может быть достаточно хорошо - может быть, существует более надежный способ регулярных выражений?

Когда я выполняю нижеприведенный сценарий с моим сценарием длиной 7 000 строк, он работает (!) И отбрасывает огромное количество комментариев. , НО, размер выходного файла почти удвоился (!?) с 400 КБ до 700 КБ. Кто-нибудь понимает, почему это происходит и как это предотвратить (это как-то связано с спецификацией или Unicode или подобными вещами? Похоже, что Out-File действительно увеличивает размер файла!)

$x = Get-Content ".\myscript.ps1"   # $x is an array, not a string
$out = ".\myscript.ps1"
$x = $x -split "[\r\n]+"               # Remove all consecutive line-breaks, in any format '-split "\r?\n|\r"' would just do line by line
$x = $x | ? { $_ -notmatch "^\s*$" }   # Remove empty lines
$x = $x | ? { $_ -notmatch "^\s*#" }   # Remove all lines starting with ; including with whitespace before
$x = $x | % { ($_ -split " #")[0] }    # Remove end of line comments
$x = ($x -replace $regex).Trim()       # Remove whitespace only at start and end of line
$x | Out-File $out
# $x | more

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Честно говоря, лучший способ определить и обработать все комментарии - это использовать синтаксический анализатор языка PowerShell или один из классов Ast. Я прошу прощения за то, что не знаю, какой Ast содержит комментарии; так что это более уродливый способ отфильтровать комментарии блока и строки.

$code = Get-Content file.txt -Raw
$comments = [System.Management.Automation.PSParser]::Tokenize($code,[ref]$null) |
    Where Type -eq 'Comment' | Select -Expand Content
$regex = ( $comments |% { [regex]::Escape($_) } ) -join '|'

# Output to remove all empty lines
$code -replace $regex -split '\r?\n' -notmatch '^\s*$'

# Output that Removes only Beginning and Ending Blank Lines
($code -replace $regex).Trim()
1 голос
/ 02 апреля 2020

Сделайте обратный пример: выведите только те строки, которые НЕ соответствуют:

## Output to console
Get-Content .\file.ps1 | Where-Object { $_ -notmatch '#' }

## Output to file
Get-Content .\file.ps1 | Where-Object { $_ -notmatch '#' } | Out-file .\newfile.ps1 -Append
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...