2016-03-29 26 views
5

Powód, który robię to

Próbuję ustawić token w pliku, który mam. Zawartość tokena jest 1 linia w pliku, a jego wartość jest ciąg $token=$false

Zmniejsz do kodu testu

Kiedy próbuję przekonwertować ten żeton na wartość bool, mam pewne problemy. Napisałem więc kod testowy i stwierdziłem, że nie jestem w stanie przekonwertować łańcucha na wartość bool.

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

Write-Host '$boolValue =' $boolValue 

To daje następujący błąd ...

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 

Jak widać, używam wartość $false jak sugeruje komunikat o błędzie, ale nie jest to akceptuje. Jakieś pomysły?

+0

Zobacz także http://stackoverflow.com/questions/27484682/safely- konwertowanie- do-bool-w-powershell –

Odpowiedz

6

W PowerShell zwykłą postacią escape jest backtick. Normalne ciągi są interpolowane: symbol PowerShell jest rozumiany i analizowany przez symbol $. Aby uniknąć interpolacji, musisz uciec przed urządzeniem $. To powinno działać dla Ciebie:

[String]$strValue = "`$false" 

Aby przekonwertować "$ true" lub "$ false" na wartość logiczną w sposób ogólny, należy najpierw spaść wiodącą $:

$strValue = $strValue.Substring(1) 

następnie przekonwertować do logiczna:

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

Używając kodu z Twojego komentarza, najkrótsza rozwiązaniem byłoby:

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

Problem polega na przypisaniu go jako prawdziwego. Powinien być fałszywy, ponieważ właśnie taki łańcuch odczytuje jako. Być może powinienem po prostu dodać inną instrukcję if/else, aby sobie z tym poradzić. Ale myślę, że nie musiałbym. –

+0

Próbowałem parsować "false" jako boolean, ale bez powodzenia i tego samego wyniku. Bool jest używany do tokena w złożonym projekcie, który piszę. Więc jest to preferowane. W przeciwnym razie zamiast po prostu mówić '$ tokenInUse', musiałbym napisać' $ tokenInUse -eq 'false'' w wielu instrukcjach if, for i while loops. Staram się, aby mój kod był jak najbardziej czysty. –

+0

Uwaga: cała linia wygląda następująco: $ AD_Export_TokenFromConfigFile = Get-Content $ AD_Export_ConfigFile | % {If ($ _ -match "SearchUsersInfoInAD_ConfigToken =") {($ _ -replace '* SearchUsersInfoInAD_ConfigToken * =', ''). Trim()}} '. Otrzyma to wartość '$ true' lub' $ false' jako ciąg znaków. Próbuję go rzucić, ale zawsze rzuca się w prawdę ... –