Share via


Windows PowerShell: Às vezes, o texto é a melhor solução

Você não tem que overthink o problema quando você pode usar o Windows PowerShell para fazer as coisas rapidamente e facilmente.

Don Jones

Após um ano de tomar seu Windows PowerShell perguntas, parecia uma boa idéia rever algumas das perguntas mais antigas. Um presente desde os primeiros dias realmente destaca algumas das formas que do Windows PowerShell ajuda você a obter coisas feita. Ele também mostra como ele pode pagar para não overthink o problema.

Parafraseando a pergunta, este leitor teve um arquivo XML que incluiu um comentário:

<!-- <tag attribute="value">Data</tag> -->

Como você pode ver, as tags de comentário (o "<!-" e o "->") Coloque uma marca XML. Seu objetivo era un-comentário que, assim o XML resultante teria a marca "ativo" em vez de "comentado." Ele começou usando Get-Content para ler o arquivo, mas converter o resultado como um tipo de dados XML do Windows PowerShell:

[xml]$file = Get-Content myfile.xml

O que algumas pessoas não entendem sobre este truque é que ele força o Windows PowerShell, através do Microsoft .NET Framework, para analisar o arquivo XML e construir uma hierarquia de objeto que representa o conteúdo do arquivo XML. Não é diferente de usar Import-CliXML, embora este truque particular vai ler qualquer arquivo XML válido, bem formado. Import-CliXML destina-se a ler o formato XML específico criado por Export-CliXML.

Enfim, o problema com o tratamento o conteúdo do arquivo como XML é que XML pode ser um dor no pescoço para trabalhar com. Para localizar um comentário e un-comentário, você realmente tem que fazer um pouco de codificação. E este é o código que eu conheço não pessoalmente.

A abordagem pragmática

Deixe-me passo para trás por um momento e oferecer um pouco de aconselhamento filosófico. Enquanto eu fiz desenvolvimento de software no passado, eu nunca fui um desenvolvedor profissional, treinado. No coração, eu sempre fui um administrador. Um dos meus primeiros empregos foi como um AS / 400 sysop. Administradores, acho, são criaturas pragmáticas. "Ver o problema, corrija o problema e depois ir para casa para o dia," é como eu frequentemente descrevem a atitude geral da admin.

Os desenvolvedores, por outro lado, têm um desejo arraigado de fazer o que é "certo". Eles podem produzir algum código olhando feio enquanto eles prototipagem e descobrir como algo funciona, mas eles quase sempre voltar e regravar ou ajustá-lo para ser "direito". Então um desenvolvedor, confrontado com a necessidade de modificar o XML como eu descrevi, provavelmente gastaria como demora para descobrir a maneira "certa" para realizar a tarefa. Que provavelmente envolveria manipulação XML via mágico material de caixa-preta do .NET Framework XML.

Não é que a minha abordagem. Eu só não tenho esse tipo de tempo. O que tem é uma maneira de obter a tarefa feita independentemente. Minha sugestão foi parar de tratar o arquivo como XML. Afinal, nós realmente não precisamos mexer com qualquer um dos dados no arquivo, então porque fazer Windows PowerShell analisá-lo todos fora do formato XML? Precisamos apenas fazer uma pequena modificação simples do texto bruto:

$text = Get-Content myfile.xml $text = $text –replace '<!--','' $text = $text –replace '-->','' $text | Out-File newfile.xml

O leitor quis cada comentário XML removido, e é isso que faz a minha solução. Ele simplesmente olha para todas as ocorrências de caracteres de marca de comentário e substitui-los com uma seqüência de caracteres vazia. Isso efetivamente remove o comentário e faz com que a marca XML fechada "ativo" para qualquer processo era realmente lendo e usando esse arquivo XML.

Então a minha solução foi ignorar o facto do arquivo XML. Eu não preciso fazer nada "XML-ish". Eu só precisava remover alguns caracteres. Por tratá-la como texto sem formatação (Observe que eu não lançá-lo para [xml] ao obter o conteúdo), eu poderia usar os operadores de manipulação de texto do Windows PowerShell perfeitamente capazes de realizar a tarefa.

Esta filosofia meu carrapatos, por vezes, as pessoas fora. Às vezes as pessoas irão perguntar: "Como você pode modificar as permissões de arquivo e pasta no Windows PowerShell?" Eu vou dar de ombros e dizer, "XCacls." Ele é executado no Windows PowerShell, eu sei como usá-lo e ele começa o trabalho feito.

As alternativas — Get-ACL e Set-ACL — são demasiado complicados. Eles exigem o conhecimento mais profundo de um monte de coisas do .NET Framework que, francamente, eu não estou interessado em aprender agora mesmo. Por que se preocupar quando já existe uma perfeitamente boa maneira de começar o trabalho feito?

Obviamente, minha filosofia é partilhada pela equipe do Windows PowerShell. Por que mais eles trabalhar tão arduamente para certificar-se que executáveis externos como XCacls, Ipconfig, Ping e como todo trabalho de dentro do Windows PowerShell? Eles sabiam que nós já sabemos como usar essas ferramentas, e fazê-los trabalhar dentro do Windows PowerShell dá-em um avanço na obtenção de nossos trabalhos.

Ninguém está aprendendo Windows PowerShell "apenas porque." Aprendemos isso porque torna nosso trabalho mais fácil. Isso só acontece, porém, se ele ainda nos permite usar as ferramentas que já sabemos. Você é bem-vindo a discordar com a minha abordagem "ver o problema, corrigir a problema e ir para casa." Muitas pessoas fazem. No entanto, acho que é uma abordagem prática quando você só tem um trabalho para fazer e você não se importa como bonito ou feio a solução é, enquanto o trabalho é feito.

Don Jones

Don Jones é um Microsoft MVP Award destinatário e autor de "Aprender Windows PowerShell em um mês de almoços" (Manning Publications, 2011), um livro concebido para ajudar qualquer administrador tornar-se eficaz com o Windows PowerShell. Jones também oferece formação de pública e no local do Windows PowerShell. Entre em contato com ele através do ConcentratedTech.com ou bit.ly/AskDon.

Conteúdo relacionado