powershell formata um valor que já é uma string

2

Eu tenho alguns valores que quero formatados de uma maneira específica. Para ser muito claro, é um octeto de endereço IP e eu quero em um formato "xxx". Por exemplo, se eu tiver um valor de octeto de "20", quero exibi-lo como "020" e não "20".

Por fim, vou ter uma matriz preenchida com IPs e quero formatá-los adequadamente.

Aqui está um exemplo que eu sei que funciona, e eu descobri que um membro get é um inteiro.

$Test = 1

$Test.ToString("000")

001

Isso não funciona. Eu descobri através de um Get-Member que o valor já é uma string.

$Test = "1"

$test.ToString("000")

Cannot find an overload for "tostring" and the argument count: "1".
At line:1 char:2
+ $test.tostring("000")
+  ~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

Alguma ideia de como eu posso obter o valor que já é uma string formatada como eu posso com o valor que é um inteiro? A longo prazo, espero que o exemplo $ test realmente contenha um endereço IP completo.

Por exemplo, 10.10.10.10 Eu gostaria de ser 010.010.010.010

Resposta Para os interessados Ao utilizar o exemplo @GregL, consegui reunir um exemplo funcional para um formato IP completo com zeros à esquerda, que é mostrado abaixo para referência.

$Test = "10.10.10.10"
$test2 = ($test.Split(".") | ForEach-Object {$_.tostring().padleft(3, '0')}) -join "."
    
por Eric C. Singer 18.03.2015 / 16:47

2 respostas

4

Presumivelmente, você está tentando formatá-los dessa forma para que todos eles fiquem bem alinhados.

O único problema é que 020 não é o mesmo que 20. Não de acordo com este .

Windows for Workgroups with TCP/IP-32 and Windows NT utilities can accept Internet Protocol (IP) addresses comprised of decimal, octal, or hexadecimal numbers. This can cause confusion if you unintentionally use a leading zero in a decimal octet. With a leading zero, the number is resolved by these utilities as an octal number, thus specifying the wrong IP address.

O artigo diz que só se aplica ao Windows 2000 e NT, mas eu tentei no meu PC com Windows 7 e é a mesma história.

Para responder à sua pergunta inicial, use o método PadLeft :

$Test = 1
$Test.ToString().PadLeft(3, '0')
001
    
por 18.03.2015 / 16:59
0

Eu uso essas grandes funções de matemática da sub-rede escritas por Chris Dent. Armazene sua lista de endereços no decimal puro (decimal não pontuado) ou em valores binários puros. Classifique a lista, recupere a lista e finalmente exiba a lista utilizando a função ConvertTo-DottedDecimalIP. Muitas outras grandes funções de sub-rede em seu blog.

    
por 23.03.2015 / 15:31