Мой предпочтительный способ:
$x_num = oct("0b" . $x_bin);
Цитата из man perlfunc
:
oct EXPR oct Interprets EXPR as an octal string and returns the corresponding value. (If EXPR happens to start off with "0x", interprets it as a hex string. If EXPR starts off with "0b", it is interpreted as a binary string. Leading whitespace is ignored in all three cases.)
PowerShell имеет так называемый PSObject, который является оболочкой для любого объекта .NET (или это может быть полностью настраиваемый объект), и когда вы вызываете Add-Member, PowerShell неявно обертывает реальный объект. NET с PSObject.
Способ работы Add-Member зависит от того, начали вы с PSObject или нет. Если вы не начали с PSObject, Add-Member заключит входные данные в PSObject, и вам нужно будет повторно назначить переменную, чтобы увидеть адаптированный объект.
Так, например:
$x = [Environment]::OSVersion
$x | Add-Member NoteProperty IsVista $true
$x | Format-List # does not show the new property
Это поскольку OSVersion не упакован, это объект PSObject. Add-Member оборачивает его, но эта оболочка теряется, потому что вы не переназначаете $ x обернутому объекту. Противопоставьте этому поведению:
$x = New-Object OperatingSystem ('Win32NT', '6.0')
$x | Add-Member NoteProperty IsVista $true
$x | Format-List # DOES show the new property
Это связано с тем, что New-Object неявно обертывает новый экземпляр в PSObject.