2016-03-29 1 views
5

Причина Я делаю это

Я пытаюсь установить маркер в файле у меня есть. Содержание маркера является 1 строка в файле, и это строка значение $token=$false

Упрощенная для тестового кода

Когда я пытаюсь преобразовать этот маркер в логическое значение, у меня возникают некоторые проблемы. Поэтому я написал тестовый код и обнаружил, что не могу преобразовать строку в значение bool.

[String]$strValue = "$false" 
[Bool]$boolValue = $strValue 

Write-Host '$boolValue =' $boolValue 

Это дает следующее сообщение об ошибке ...

Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead. 
At :line:2 char:17 
+ [Bool]$boolValue <<<< = $strValue 

Как вы можете видеть, я использую значение $false как предложено в сообщении об ошибке, но не принимать его. Есть идеи?

+0

См. Также http://stackoverflow.com/questions/27484682/safely-converting-string-to-bool-in-powershell –

ответ

6

В PowerShell обычным escape-символом является обратная сторона. Обычные строки интерполируются: символ $ понимается и анализируется PowerShell. Чтобы предотвратить интерполяцию, вам необходимо избежать $. Это должно работать для вас:

[String]$strValue = "`$false" 

Для преобразования «$ истинный» или «$ ложь» в булево в общем виде, вы должны сначала удалить ведущую $:

$strValue = $strValue.Substring(1) 

Затем преобразовать булево:

[Boolean]$boolValue = [System.Convert]::ToBoolean($strValue) 

Использование кода из вашего комментария, кратчайшее решение будет:

$AD_Export_TokenFromConfigFile = 
    [System.Convert]::ToBoolean(Get-Content $AD_Export_ConfigFile 
           | % { 
             If($_ -match "SearchUsersInfoInAD_ConfigToken=") { 
              ($_ -replace '*SearchUsersInfoInAD_ConfigToken*=','').Trim() 
             } 
            }.Substring(1)) 
+0

Проблема в том, что это присваивает ему значение true. Он должен быть ложным, потому что это то, что строка читает как. Может быть, мне стоит добавить еще один оператор if/else для его обработки. Но я бы подумал, что мне этого не понадобится. –

+0

Я пробовал разыгрывать «ложь» как логическое, но не удачи и того же результата. Bool используется для символики в сложном дизайне, который я пишу. Так что это предпочтительнее. В противном случае вместо того, чтобы просто говорить '$ tokenInUse', мне пришлось бы писать' $ tokenInUse -eq 'false'' в нескольких операторах if, для циклов while и while. Я стараюсь, чтобы мой код был чистым, насколько это возможно. –

+0

Примечание: вся строка выглядит так: $ AD_Export_TokenFromConfigFile = Get-Content $ AD_Export_ConfigFile | % {If ($ _ -match "SearchUsersInfoInAD_ConfigToken =") {($ _ -replace '* SearchUsersInfoInAD_ConfigToken * =', ''). Trim()}} '. Это получает значение '$ true' или' $ false' как строку. Я просто пытаюсь передать его в bool, но он всегда отличает true ... –