Как избежать двойного комментирования строки в файле .ini? - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь получить и изменить содержимое файла .ini, однако мне нужно убедиться, что искомому тексту не предшествует точка с запятой, что указывает на то, что строка "закомментирована"".

Файл .ini содержит блок параметров, а неиспользуемый блок закомментирован, как показано ниже.

;   use the following 2 settings for Sierra external GPS  
;GPSType=Sierra  
;Interface=PPP  
;   use the following 3 settings for internal NMEA GPS  
GPSType=NMEA  
Interface=Serial  
Com=4

Я пробовал оператор If вМой конвейер, однако это не будет разрешено.

   $EOF = {
     Write-Host "Ending Program"
     break
   }
Write-Host "test Application Internal/External Modem Selector"     -BackgroundColor Green -ForegroundColor Black
Write-Host
Write-Host "*** Please ensure test is not running ***" -ForegroundColor     Yellow
Write-Host
if (!(Test-Path "C:\Program Files (x86)\Rogers\test\test.ini"))
  {
Write-Host "Warning - test.INI not present" -BackgroundColor Black -ForegroundColor Red |
Return(0)
  }
Write-Host
Write-Host "1.  Convert for Internal modem (COM4)"
write-Host "4.  Convert for External modem"
Write-Host "Q.  Exit"
Write-Host
$menuresponse = Read-Host 'Choose the option >'
if ($menuresponse -eq "q") {
&$EOF
  }
elseif ($menuresponse -eq "1") 
  {
(Get-Content "C:\Program Files (x86)\Rogers\test\test.ini") |
  If (($_).notcontains(';Com'))
  {
   {
    ForEach-Object {$_ -replace 'GPSType=Sierra' , ';GPSType=Sierra' } |
    ForEach-Object {$_ -replace 'Interface=PPP' , ';Interface=PPP' } |
    ForEach-Object {$_ -replace ';GPSType=NMEA' , 'GPSType=NMEA' } |
    ForEach-Object {$_ -replace ';Interface=Serial' , 'Interface=Serial' } |
    ForEach-Object {$_ -replace ';Com=.*' , 'Com=4' } |
    Set-Content "C:\Program Files (x86)\Rogers\test\test.ini"
   }
  else
   { 
    ForEach-Object {$_ -replace 'Com=.*' , 'Com=4'
    Set-Content "C:\Program Files (x86)\Rogers\test\test.ini"
   }
  }
   }}
elseif ($menuresponse -eq "4") 
  {
   (Get-Content "C:\Program Files (x86)\Rogers\test\test.ini") |
 If (($_).notcontains(';Com'))
 {
  { 
   ForEach-Object {$_ -replace ';GPSType=Sierra' , 'GPSType=Sierra' } |
   ForEach-Object {$_ -replace ';Interface=PPP' , 'Interface=PPP' } |
   ForEach-Object {$_ -replace 'GPSType=NMEA' , ';GPSType=NMEA' } |
   ForEach-Object {$_ -replace 'Interface=Serial' , ';Interface=Serial' } |
   ForEach-Object {$_ -replace 'Com=.*' , ';Com=6' } |
   Set-Content "C:\Program Files (x86)\Rogers\test\test.ini"
  }
  else
   { 
    Write-Host "Modem already set to External"
    &$EOF
   }
  }
  }
else
{ write-host "Invalid Choice"
}
  Break

Есть ли способ гарантировать, что я не буду в конечном итоге "двойного комментирования" параметра в файле .ini, распознавая, имел ли онточка с запятой, предшествующая этому, перед передачей инструкции?

1 Ответ

0 голосов
/ 23 мая 2018

Мне нужно убедиться, что искомому тексту не предшествует точка с запятой

Поскольку вы уже используете регулярное выражение, почему бы не использовать начало привязки строки ^в ваших матчах

ForEach-Object {$_ -replace '^GPSType=Sierra' , ';$0' } |

Это заменит GPSType = Sierra, но только если оно в начале строки.Если линия уже выглядит как; GPSType = Sierra, она не будет соответствовать

Обратите внимание на использование $0 при замене.Он представляет всю строку соответствия.Использование этого может помочь предотвратить двойной ввод.


  • Вам действительно стоит взглянуть на систему выбора PowerShell .Супер прост в реализации и более объектно-ориентированный подход. Вот мой ответ , который реализует его

  • Вы можете связать -replace, поэтому вам не нужно многократное foreach-object: '123' -replace '1','One' -replace '2','Two' -replace '3','Three'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...