2016-03-29 29 views
5

Motivo che sto facendo Questo

Sto provando a impostare un token in un file che ho. Il contenuto del token è di 1 riga nel file, ed è il valore stringa è $token=$false

Semplificato a codice di prova

Quando provo a convertire questo token in un valore booleano, sto avendo qualche problema. Così ho scritto il codice di test e ho scoperto che non sono in grado di convertire la stringa in un valore bool.

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

Write-Host '$boolValue =' $boolValue 

Questo dà il seguente errore ...

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 

Come potete vedere, sto usando il valore $false come suggerito dal messaggio di errore, ma non è accettarla. Qualche idea?

+0

Vedere anche http://stackoverflow.com/questions/27484682/safely-converting-string-to-bool-in-powerhell –

risposta

6

In PowerShell, il solito carattere di escape è l'apice. Le stringhe normali vengono interpolate: il simbolo $ viene compreso e analizzato da PowerShell. È necessario sfuggire allo $ per impedire l'interpolazione. Questo dovrebbe funzionare per voi:

[String]$strValue = "`$false" 

Per convertire "$ true" o "$ false" per un valore booleano in modo generico, è necessario innanzitutto eliminare il leader $:

$strValue = $strValue.Substring(1) 

poi convertire in booleano:

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

Utilizzando il codice dal tuo commento, la soluzione più breve potrebbe essere:

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

Il problema è assegnarlo come vero. Dovrebbe essere falso perché è quello che la stringa legge come. Forse dovrei semplicemente aggiungere un'altra istruzione if/else per gestirlo. Ma penserei che non dovrei farlo. –

+0

Ho provato a parsing "false" come booleano, ma senza fortuna e stesso risultato. Il bool è usato per un token in un disegno complesso che sto scrivendo. Quindi è preferito. Altrimenti, invece di dire semplicemente '$ tokenInUse', dovrei scrivere' $ tokenInUse -eq 'false'' in più istruzioni if, per e while loop. Cerco di mantenere il mio codice il più pulito possibile. –

+0

Nota: l'intera riga è simile a '$ AD_Export_TokenFromConfigFile = Get-Content $ AD_Export_ConfigFile | % {If ($ _ -match "SearchUsersInfoInAD_ConfigToken =") {($ _ -replace '* SearchUsersInfoInAD_ConfigToken * =', ''). Trim()}} '. Questo ottiene il valore di '$ true' o' $ false' come una stringa. Sto solo provando a lanciarlo su un bool, ma si rivela sempre vero ... –