O PowerShell está pronto para substituir meu shell Cygwin no Windows? [fechadas]

384

Estou debatendo se devo aprender o PowerShell, ou ficar com os scripts Cygwin / Perl / shell scripts Unix, etc.

O benefício do PowerShell seria que os scripts pudessem ser mais facilmente usados ​​por colegas de equipe que não possuem Cygwin; no entanto, não sei se realmente escreveria muitos scripts de uso geral ou se as pessoas os usariam.

O script Unix é tão poderoso que o PowerShell chega perto o suficiente para garantir a troca?

Aqui estão algumas das coisas específicas (ou equivalentes) que eu procuraria no PowerShell:

  • grep
  • ordenar
  • uniq
  • Perl (a que distância o PowerShell chega dos recursos do Perl?)
  • AWK
  • sed
  • file (o comando que fornece informações sobre o arquivo)
  • etc.
Andy White
fonte
7
Eu não diria isso, estava interessado em pegar o Powershell, encontrei esta página e agora sei as diferenças gerais entre o PS e os scripts de shell aos quais estou acostumado.
Bender the Great
5
Este post subiu de repente de cinzas em um envio de link do HN. Ótimo trabalho. E ruim para o @Bobby por encerrar isso como não construtivo.
Sid
26
Se alguém não pode perguntar até que ponto uma ferramenta replica as funções de outra, o SO não pode responder a perguntas de comparação de ferramentas. Isso é cuidadosamente redigido para evitar controvérsias, mas foi considerado descuidado "polêmico" simplesmente por parecer uma pergunta do Unix vs Windows. E obteve uma resposta objetiva e factual, com informações factuais adicionais sobre a utilidade dos scripts Unix no Windows.
Chernevik
16
Por que isso está fechado, de novo? Alguém edite o título para dizer "PowerShell vs Shell do Unix na plataforma Windows" para evitar que os trolls o tratem como "Windows vs Unix", o que não é. Esta é uma pergunta perfeitamente construtiva - votada para reabrir.
x0n 16/07/12
3
A operação está misturando shell com ferramentas. O PowerShell tem seu uso. Mas o GNU é um projeto para levar brindes do UNIX livremente para outros sistemas operacionais, incluindo o Windows. Tudo na lista de opções oferece uma implementação de gnu no Windows. Acessível a partir do GnuWin32 ou sites individuais. O BAT do Windows não é inútil, possui redirecionamento, canal e condições.
MeaCulpa

Respostas:

783

Ferramentas são apenas ferramentas.
Eles ajudam ou não.
Você precisa de ajuda ou não.

Se você conhece o Unix e essas ferramentas fazem o que você precisa no Windows - você é um cara feliz e não precisa aprender o PowerShell (a menos que queira explorar).

Minha intenção original era incluir um conjunto de ferramentas Unix no Windows e acabar com ele (vários de nós na equipe têm profundos conhecimentos de Unix e uma dose saudável de respeito por essa comunidade).

O que eu descobri foi que isso realmente não ajudou muito. A razão para isso é que o AWK / grep / sed não funciona com COM , WMI , ADSI , o Registro, o armazenamento de certificados, etc., etc.

Em outras palavras, o UNIX é um ecossistema inteiro auto-ajustado em torno de arquivos de texto. Como tal, as ferramentas de processamento de texto são efetivamente ferramentas de gerenciamento. O Windows é um ecossistema completamente diferente, auto-ajustado em torno de APIs e objetos. Foi por isso que inventamos o PowerShell.

O que eu acho que você encontrará é que haverá muitas ocasiões em que o processamento de texto não conseguirá o que você deseja no Windows. Nesse ponto, convém pegar o PowerShell. NOTA - não é um negócio de tudo ou nada. No PowerShell, você pode chamar suas ferramentas Unix (e usar o processo de texto ou o processamento de texto do PowerShell). Além disso, você pode ligar para o PowerShell a partir de suas ferramentas Unix e obter texto.

Novamente - não há religião aqui - nosso foco é fornecer as ferramentas necessárias para o sucesso. É por isso que somos tão apaixonados pelo feedback. Deixe-nos saber onde estamos caindo no emprego ou onde você não tem uma ferramenta que você precisa e nós a colocaremos na lista e chegaremos a ela.

Com toda a honestidade, estamos nos cavando de um buraco de 30 anos, por isso vai demorar um pouco. Dito isso, se você pegar a versão beta do Windows Server 2008 / R2 e / ou os betas de nossos produtos para servidores, acho que ficará chocado com a rapidez com que esse buraco está sendo preenchido.

Com relação ao uso - tivemos mais de 3,5 milhões de downloads até o momento. Isso não inclui as pessoas que o usam no Windows Server 2008, porque está incluído como um componente opcional e não precisa de download.

O V2 será enviado em todas as versões do Windows. Ele estará ativado por padrão para todas as edições, exceto o núcleo do servidor, onde é um componente opcional. Logo após o lançamento do Windows 7 / Windows Server 2008 R2, disponibilizaremos o V2 ​​em todas as plataformas, Windows XP e superior. Em outras palavras - seu investimento em aprendizado será aplicável a um número muito grande de máquinas / ambientes.

Um último comentário. Se / quando você começar a aprender o PowerShell, acho que ficará muito feliz. Grande parte do design é fortemente influenciada pelos nossos antecedentes do Unix, portanto, embora sejamos bem diferentes, você o entenderá muito rapidamente (depois de acabar discutindo que não é o Unix :-)).

Sabemos que as pessoas têm um orçamento muito limitado para aprender - é por isso que somos super rígidos quanto à consistência. Você aprenderá algo e depois o usará repetidamente.

Experimentar! Aproveitar! Se empenhar!

Jeffrey Snover - MSFT
fonte
11
Obrigado pela sua resposta. Acho que vou seguir em frente e aprender o PowerShell. Parece poderoso pelo que vi até agora, e poderei escrever scripts mais úteis com ele no trabalho.
213 Andy Andy
55
@ Jeffrey: existe a chance de um terminal melhor para o Windows? PowerShell é uma linguagem de script poderosa, mas o fato de que ele é executado em cmd.exe torna muito mais conveniente no modo interativo
sumek
47
Essa questão "não construtiva" gerou a melhor percepção que já vi sobre o mantra "no Unix tudo é um arquivo" e por que o Windows é diferente. Talvez StackOverflow seria melhor servido fechando discussões não construtivas ?
chernevik
12
@sumek - Experimente o ConEmu; Eu tenho usado por algumas semanas e é muito doce: hanselman.com/blog/...
EZ Hart
4
Atenção: o PowerShell não gosta de canalizar dados binários. Portanto, tenha cuidado ao chamar suas confiáveis ​​ferramentas Unix, apenas não faça coisas como tar -c . | gzip > package.tar.gz diretamente no PowerShell ou sofrerá. Veja brianreiter.org/2010/01/29/…
Interarticle
123

grep

Select-StringO cmdlet e o -matchoperador trabalham com regexes. Além disso, você pode usar diretamente o suporte a regex do .NET para obter funcionalidades mais avançadas.

ordenar

Sort-Objecté mais poderoso (do que eu me lembro * do nix sort). Permitindo a classificação em vários níveis em expressões arbitrárias. Aqui, a manutenção do tipo subjacente do PowerShell ajuda; por exemplo, uma DateTimepropriedade será classificada como DateTimesem precisar garantir a formatação em um formato classificável.

uniq

Select-Object -Unique

Perl (a que distância o PowerShell chega dos recursos de Perl?)

Em termos de amplitude de bibliotecas de suporte específicas de domínio do Perl: ainda não chegou nem perto.

Para programação geral, o PowerShell é certamente mais coeso, consistente e fácil de estender. A única lacuna para a troca de texto é algo equivalente ao ..operador de Perl .

AWK

Já faz bastante tempo desde que o AWK foi usado (deve ser> 18 anos, pois mais tarde usei o Perl), então não posso comentar.

sed

[Veja acima]

file (o comando que fornece informações sobre o arquivo)

A força do PowerShell aqui não é muito do que pode fazer com os objetos do sistema de arquivos (e obtém informações completas aqui, dirretornos FileInfoou FolderInfoobjetos, conforme apropriado) é que é o modelo de provedor inteiro.

Você pode tratar o registro, o armazenamento de certificados, o SQL Server, o cache RSS do Internet Explorer, etc. como um espaço de objeto navegável pelos mesmos cmdlets que o sistema de arquivos.


O PowerShell é definitivamente o caminho a seguir no Windows. A Microsoft tornou parte de seus requisitos para futuros produtos não domésticos. Daí suporte rico no Exchange, suporte no SQL Server. Isso só vai se expandir.

Um exemplo recente disso é o TFS PowerToys. Muitas operações do cliente TFS são feitas sem a necessidade de inicializar o tf.exe a cada vez (o que requer uma nova conexão com o servidor TFS, etc.) e é notavelmente mais fácil processar os dados. Além de permitir amplo acesso a toda a API do cliente TFS com mais detalhes do que expostos no Team Explorer do TF.exe.

Richard
fonte
2
O fato é que o modelo de provedor é interessante apenas porque o sistema operacional não usa texto como meio de configuração universal, então você PRECISA desses fornecedores. Com o UNIX, a maioria dos idiomas possui APIs para tocar em PAM, hosts e pacotes, mas, em última análise, o texto sempre estará lá.
21909 Daishiman
12
O texto nem sempre é o melhor formato para tudo (comece com bancos de dados e imagens rasterizadas). Mas acho que podemos concordar em discordar em vez de guerras em formato aberto.
Richard Richard
5
O Powershell pode usar qualquer objeto na estrutura .NET. Isso não corresponde aos recursos de domínio do Perl? Além disso, você pode escrever cmdlets em C #, etc, se você quiser re-usabilidade
Chris S
Comparação ponto a ponto. Agradável. Essa deve ser a resposta aceita. Mentiras força do PowerShell em seus fundamentos .NET e como você pode facilmente estender o sistema escrevendo novas Cmdlets ou mesmo chamar bibliotecas de classes
Sau001
Um uso típico de sed (eu acho) seria:, sed 's/pattern/replacement/' fileque é aproximadamente gc file | %{$_ -replace 'pattern','replacement'}e similarmente para o awk: awk 'BEGIN {} /pat1/ {action1} /pat2/ {action2} END {}' fileé aproximadamente{BEGIN {}; switch -r -c -file file { 'pat1' {action1} 'pat2' {action2}}; END{};}
Nathan Chappell
56

Como alguém cuja carreira se concentrou no desenvolvimento corporativo do Windows de 1997 a 2010, a resposta óbvia seria o PowerShell por todas as boas razões dadas anteriormente (por exemplo, faz parte da estratégia corporativa da Microsoft; integra-se bem ao Windows / COM / .NET; e o uso de objetos em vez de arquivos fornece um modelo de codificação "mais rico"). Por esse motivo, eu estava usando e promovendo o PowerShell nos últimos dois anos, com a crença expressa de que estava seguindo a "Palavra de Lei".

No entanto, como pragmático, não tenho mais certeza de que o PowerShell seja uma ótima resposta. Embora seja uma excelente ferramenta do Windows e forneça um passo muito necessário para preencher o buraco histórico que é a linha de comando do Windows, enquanto todos observamos o aperto da Microsoft na computação do consumidor, parece cada vez mais provável que a Microsoft tenha uma grande batalha pela frente para manter seu sistema operacional como importante para a empresa do futuro.

De fato, considerando que meu trabalho está cada vez mais em ambientes heterogêneos, estou achando muito mais útil usar scripts Bash no momento, pois eles não apenas funcionam no Linux, Solaris e Mac OS X, mas também funcionam - com o ajuda do Cygwin - no Windows.

Portanto, se você acredita que o futuro do sistema operacional é comoditizado em vez de monopolizado, parece fazer sentido optar por uma estratégia de ferramenta de desenvolvimento ágil que se afaste das ferramentas proprietárias, sempre que possível. Se, no entanto, você vir seu futuro sendo dominado por tudo o que é Redmond, vá para o PowerShell.

Ubiguchi
fonte
11
Os scripts unix funcionam perfeitamente no Cygwin-Windows sem erros?
Pacerier
@Pacerier Estou usando o Cygwin e o MinGW há 12 anos e tive problemas surpreendentemente raramente. O importante é que, se algo não funcionar, é sempre possível recorrer às ferramentas do Windows, ou qualquer outra coisa - os processos podem ser iniciados da mesma maneira que qualquer outro shell os inicia.
Evgeni Sergeev
4
Ok, sua resposta é de 2011. Hoje o powershell também roda em linux. E - na minha opinião pessoal - o bash é muito antigo. A sintaxe é horrível e eu prefiro usar uma linguagem de script diferente. Atualmente, com o python sendo padrão na maioria das distribuições linux, não vejo motivo para usar o bash para scripts. Eu aconselho que você verifique powershell novamente como tem acontecido muito desde 2011.
itmuckel
33

Eu usei um pouco do PowerShell para automação de scripts. Embora seja muito bom que o ambiente pareça ter sido pensado muito mais que os shells do Unix, na prática o uso de objetos em vez de fluxos de texto é muito mais desajeitado, e muitas das instalações do Unix que foram desenvolvidas nos últimos 30 ainda faltam anos.

Cygwin ainda é meu ambiente de script preferido para hosts do Windows. Certamente supera as alternativas em termos de realização de tarefas.

Daishiman
fonte
27
Usar objetos é uma mudança de paradigma e leva algum tempo para se acostumar. Mas evita toda a nova análise em cada etapa em que os dados estruturados estão envolvidos (por exemplo, não é necessário garantir que os campos sejam delimitados).
Richard Richard
16
@Andy White @Daishiman, posso entender onde há uma curva de aprendizado com o PowerShell, mas os objetos de tubulação podem ser muito mais flexíveis do que o texto de tubulação. @ Richard está correto. :)
Steven Murawski
18
Os fabricantes de automóveis também tiveram dificuldade em discutir com mais de 1000 anos de cavalos. Não estou tentando ser irreverente. Apenas salientar que o sucesso passado não remove o benefício potencial da inovação.
EBGreen 21/02
12
@daishiman - O benefício dos Objetos é que, quando você deseja uma propriedade, solicita-a - não precisa analisar, adivinhar e lançar. Não entendi seu ponto de vista sobre "o que acontece quando os objetos não têm métodos compatíveis" - Você poderia dizer isso de outra maneira ou dar um exemplo do problema? Obrigado.
Jeffrey Snover - MSFT
13
@Daishiman - eu entendo. Na prática, as pessoas descobriram que isso não é um problema, mas uma enorme vantagem. Dito isso, posso ver que, se você fosse um analisador de texto especializado, essa seria uma nova habilidade a ser aprendida e, a princípio, pode parecer desnecessária e desagradável. Mais uma vez - o que ajuda é a ferramenta certa.
Jeffrey Snover - MSFT
15

Há muitas ótimas respostas aqui, e aqui está minha opinião. O PowerShell está pronto se você estiver ... Exemplos:

grep = " Select-String -Pattern "

sort = "objeto de classificação"

uniq = " Get-Unique "

file = " Get-Item "

cat = " Obter conteúdo "

Perl / AWK / Sed não são comandos, mas os utilitários são difíceis de comparar, mas você pode fazer quase tudo no PowerShell.

Vic
fonte
2
Você pode acreditar nos comandos enigmáticos de quatro letras que nossos ancestrais foram forçados a usar?
Evgeni Sergeev 24/05
4
@EvgeniSergeev Todos os acima estão disponíveis por padrão, como sls, sort, gu, gi, gc, respectivamente. Nomes longos e legíveis, com tabulação completa e nomes curtos de digitação em um sistema. Esse é um progresso fácil de usar para você.
TessellatingHeckler
Um dos pseudônimos para Get-Contenté cat, portanto, para aquele não há diferença entre Cygwin / Unix e PowerShell. Infelizmente, na maioria dos casos, a documentação da Microsoft para cmdlets não possui informações sobre os aliases, mas uma lista de todos os aliases é exibida usando-seGet-Alias em uma sessão do PowerShell. O alias para "Get-Unique" é "gu", então é mais curto que o Cygwin / Unix!
Peter Mortensen
13

Apenas recentemente comecei a me interessar no PowerShell com algum grau de seriedade. Embora, nos últimos sete anos, trabalhe em um ambiente quase exclusivamente baseado no Windows, eu sou do Unix e me pego constantemente tentando "Unix-fy" minha experiência de interação no Windows. É frustrante para dizer o mínimo.

É justo comparar o PowerShell com algo como Bash , tcsh ou zsh, já que utilitários como grep , sed , awk , find etc. não são, estritamente falando, parte do shell; eles sempre farão parte de qualquer ambiente Unix. Dito isto, um comando do PowerShell como o Select-String tem uma função muito semelhante ao grep e é empacotado como um módulo principal no PowerShell ... para que as linhas fiquem um pouco desfocadas.

Eu acho que o principal é a cultura , e o fato de os respectivos conjuntos de ferramentas incorporarem suas respectivas culturas:

  • O Unix é uma cultura baseada em arquivo (em geral, não Unicode) baseada em arquivo . Os arquivos de configuração são quase exclusivamente arquivos de texto . O Windows, por outro lado, sempre foi muito mais estruturado em relação aos formatos de configuração - as configurações geralmente são mantidas em bancos de dados proprietários (por exemplo, o registro do Windows) que requerem ferramentas especializadas para seu gerenciamento.
  • A interface administrativa (e, por muitos anos, de desenvolvimento) do Unix tradicionalmente tem sido a linha de comando e o terminal virtual. O Windows iniciou como uma GUI e as funções administrativas apenas recentemente começaram a deixar de ser exclusivamente baseadas em GUI. Podemos esperar que a experiência do Unix na linha de comando seja mais rica e madura, dada a liderança significativa que ela tem no PowerShell, e minha experiência corresponde a isso. Sobre isso, na minha experiência:

    • A experiência administrativa do Unix é voltada para facilitar as coisas em uma quantidade mínima de pressionamentos de tecla; isso é provavelmente o resultado da situação histórica de ter que administrar um servidor em uma conexão dial-up lenta de 9600 bauds. Agora PowerShell tem aliases que percorrer um longo caminho para se locomover pela vez detalhado verbo-substantivo padrão, mas para conhecer esses aliases é um pouco de dor (alguém sabe de algo melhor do que: alias | where {$_.ResolvedCommandName -eq "<command>"}?).

      Um exemplo da maneira rica pela qual a história pode ser manipulada:

      iptablesos comandos costumam ser longos e repeti-los com pequenas diferenças seria uma dor se não fosse apenas um dos muitos recursos interessantes de manipulação de histórico incorporados ao Bash , portanto, a inserção de uma regra do iptables como a seguinte:

      iptables -I camera-1-internet -s 192.168.0.50 -m state --state NEW -j ACCEPT

      uma segunda vez para outra câmera (" camera-2"), é apenas um caso de emissão:

      !!:s/-1-/-2-/:s/50/51

      o que significa "executar o comando anterior, mas substitua -1-por -2-e 50com 51.

    • A experiência Unix é otimizada para datilógrafos; pode-se praticamente fazer tudo sem sair da posição "casa". Por exemplo, no Bash , usando as combinações de teclas do Emacs (sim, o Bash também suporta vi bind), percorrer o histórico é feito usando Ctrl-Pe Ctrl-Nenquanto se move para o início e o final de uma linha usando Ctrl-Ae Ctrl-Erespectivamente ... e definitivamente não termina aí. Experimente até a navegação mais simples no console do PowerShell sem sair da posição inicial e você está com problemas.

    • Coisas simples, como paginação versátil (a menos ) no Unix, não parecem estar disponíveis prontamente no PowerShell, o que é um pouco frustrante, e também não existe uma rica experiência de editor. Obviamente, sempre é possível fazer o download de ferramentas de terceiros que preencherão essas lacunas, mas com certeza seria bom se essas coisas estivessem "lá" como se estivessem em praticamente qualquer sabor do Unix.
  • A cultura do Windows, pelo menos em termos de APIs do sistema, é impulsionada em grande parte pelas estruturas de suporte, a saber, COM e .NET , ambas altamente estruturadas e baseadas em objetos. Por outro lado, o acesso às APIs do Unix é tradicionalmente realizado por meio de uma interface de arquivo ( /deve /proc) ou (não orientada a objetos) chamadas de biblioteca em estilo C. Não é surpresa, portanto, que as experiências de script correspondam aos respectivos paradigmas do SO. O PowerShell é estruturado por natureza (tudo é um objeto) e baseado em arquivos do Bash e amigos. A API estruturada à disposição de um programador do PowerShell é vasta (essencialmente correspondendo à vastidão do conjunto existente de interfaces COM e .NET padrão).

Em suma, embora os recursos de script do PowerShell sejam indiscutivelmente mais poderosos que o Bash (especialmente quando você considera a disponibilidade do .NET BCL ), a experiência interativa é significativamente mais fraca, principalmente se você estiver utilizando um teclado totalmente controlado por teclado. , perspectiva baseada em console (como muitas cabeças Unix).

Eric Smith
fonte
Você pergunta "alguém sabe de algo melhor que: alias | where {$ _. ResolvedCommandName -eq" <comand> "}?". Que tal apenas alias -Definition *property(ou qualquer outro padrão)? Acho que o problema com sua resposta é que você está confundindo o shell e o console: lembre-se de que você tem uma escolha de consoles com diferentes opções de edição. Eles deliberadamente deixaram a edição do console do DOS interrompida para incentivar as pessoas a usar outros consoles, como o ISE.
Duncan
BTW, seu !!exemplo pode ser escrito em PowerShell, (h -c 1) -replace '-1-','-2-' -replace '50','51' | iexmas é mais fácil subir a seta e editar para um único comando. Se você quiser fazer isso através de muitos comandos, acho que o Powershell venceria. Para repetir 10 comandos que terminam no comando # 255 com suas edições: (h -c 10 -id 255) -replace '-1-','-2-' -replace '50','51' | iexO histórico do Powershell também permite que você faça coisas inéditas nos shells do Linux; se você se perguntar retrospectivamente quanto tempo um comando levou para ser executado:h -id 20 | select { $_.EndExecutionTime - $_.StartExecutionTime }
Duncan
@ Duncan Em relação ao seu comentário, o shell e o console - acho que essa é apenas uma diferença fundamental entre o Bash e o PS; isto é: o Bash espera oferecer uma certa experiência interativa, enquanto o PS "deixa" isso para outra coisa. Não tenho muita experiência com o console do ISE, mas pelo que me lembro, também não tem uma experiência interativa tremendamente rica.
Eric Smith
@ Duncan, sim - bom argumento sobre a capacidade do PS de fornecer truques inteligentes da história.
Eric Smith
@Duncan ... mas apesar de sua afirmação de que algumas coisas são desconhecidos em conchas Linux:fc -e "sed -i -e 's/-1-/-2-/g' -e 's/50/51/g'" 10 255
Eric Smith
8

Eu não sou um usuário experiente do PowerShell de forma alguma, mas o pouco que eu fui exposto me impressionou bastante. Você pode encadear os cmdlets internos para fazer praticamente qualquer coisa que você possa fazer em um prompt do Unix, e há algumas vantagens adicionais em fazer coisas como exportar para CSV, tabelas HTML e para tipos mais profundos de tarefas de administração do sistema .

E se você realmente precisa de algo como sed , sempre há o UnixUtils ou o GnuWin32 , que você pode integrar com o PowerShell com bastante facilidade.

Como usuário antigo do Unix, no entanto, tive alguns problemas para me acostumar com o esquema de nomeação de comandos e certamente teria me beneficiado mais se soubesse mais sobre o .NET.

Então, basicamente, digo que vale a pena aprendê-lo, se o Windows apenas não representar um problema.

yalestar
fonte
11
Existe um projeto de código aberto "Pash" que permite executar o PowerShell em outras plataformas via Mono. tinyurl.com/6dyoso
John D. Cook
Uau! Obrigado pela dica; Eu não posso esperar para experimentá
lo
6

Se você gosta de scripts de shell, vai adorar o PowerShell!

Comece em Uma visita guiada ao Microsoft Command Shell (Ars Technica).

usuario
fonte
8
Adoro scripts de shell e tolero o PowerShell. Seus comandos e sintaxe são atrozes. Comandos e opções horrivelmente longos sem qualquer conclusão útil de comando. Ou, se houver, não o encontrei. Muitos recursos amontoados em comandos únicos que devem ser separados. Variável estranha e sintaxe de escape que apenas um programador de lotes do DOS poderia adorar.
Zan Lynx
8
@Zan Lynx - Você está certo sobre não ter encontrado coisas. Todos os comandos têm aliases e muitos deles correspondem aos comandos DOS e UNIX (ps, dir, rm, ls, kill, history, man, cat, clear etc.) Os nomes são longos, de forma que tenham um nome significativo. Ótimo para scripts - ajuda quando uma nova pessoa precisa usá-lo e mantê-lo. Há expansão de guias para cmdlets, funções, variáveis, caminho, parâmetros etc. Grande parte da sintaxe é proveniente de shells do Unix e de qual sintaxe de escape você está falando? `` não é usado para escape, pois é o separador de caminho no Windows.
manojlds
3
@Zan Lynx - Seus argumentos não são válidos. Para parar de interpretar variáveis, use '(aspas simples). Para a coisa de aspas duplas - mesmo, use write-output 'this is a "test"'. A pergunta que você está apontando é para o Regex e o escape para o regex é válido em todos os lugares. O Powershell também possui seqüências de caracteres Here-Strings / verbatim. Mesmo o Java não possui esses! Tente escapar do regex em Java. E às vezes você não usa literalpath. Você usa quando precisa. LiteralPath trata caracteres curinga literalmente e não os expande. Você o usa quando seus arquivos o possuem. Dá-lhe mais opções.
precisa saber é o seguinte
3
@manojlds: Comparado com o bash shell, o Powershell está cheio de inconsistências que não fazem sentido e são apenas confusas. No bash, você usa o mesmo caractere de escape em qualquer lugar e os caminhos de arquivo são escapados da mesma maneira que as strings. Você não precisa de um parâmetro especial para isso. Se você expandir uma variável que possui caracteres especiais, coloque-a entre aspas duplas e o conteúdo é seguro, não é necessário chamar uma função para recuperá-la.
Zan Lynx
5
@Zan Lynx - Não há inconsistências. Até write-output "this is a `"test`""funciona. Basta usar em `vez de `\`. O regex :: escape existe para ajudá-lo, para que você não perca as coisas que escapam. Não é necessário usá-lo. Você está pensando que opções adicionais disponíveis para ajudá-lo e evitar erros são inconsistências.
manojlds
6

Como meus experimentos recentes me levaram a profundidades das chamadas do PowerShell e .NET, devo dizer que o PowerShell pode substituir o shell Cygwin e Unix.

Não tenho certeza sobre o Perl, mas como o PowerShell e o Perl são Turing completos como linguagens de programação, dou isso como um sim para substituir o Perl também.

Uma coisa que o PowerShell tem acima do Cygwin e do Bash comum no * nix é a capacidade de executar chamadas DLL em área restrita, manipulando o sistema operacional por meio de chamadas diretas à API, métodos WMI e até objetos COM. Que tal iniciar o Internet Explorer via código e depois fazer o que quiser com o documento exibido, emulando efetivamente um back-end para um servidor Web?

Que tal coletar dados de servidores SQL e outros provedores de dados, analisá-los e exportar como CSV, mensagens de email, texto e qualquer tipo de formato de arquivo existente e não existente? (Com habilidades adequadas para criar um arquivo válido com os dados recebidos, é claro, mas o CSV está prontamente disponível).

E há uma segurança extra disponível por meio de cmdlets e scripts assinados, políticas de grupo e políticas de execução que ajudam a impedir que códigos maliciosos sejam executados em seu sistema, mesmo que você os execute como administrador.

Sobre quais comandos são implementados - a resposta de Richard os lista e a capacidade do PowerShell de emular sua funcionalidade já.

Sobre se o PowerShell é forte para garantir a troca - isso é mais uma questão de preferência pessoal, embora cada vez mais serviços do Windows estejam fornecendo cmdlets do PowerShell para controlá-los, não usar o PowerShell com esses serviços presentes é considerado um obstáculo. (O servidor Hyper-V é o principal serviço desse tipo e também oferece a capacidade de fazer mais com os cmdlets do PowerShell do que com a GUI!)

Provavelmente, essa resposta está atrasada cinco anos, mas ainda assim, se alguém executar tarefas administrativas ou scripts gerais de várias coisas no Windows, definitivamente deve tentar aproveitar o PowerShell para seus propósitos.

Vesper
fonte
6

Ao comparar o PowerShell à combinação Cygwin / Perl / Shell, saiba que o PowerShell representa apenas a parte "Shell" dessa combinação.

No entanto, você pode invocar qualquer comando do PowerShell da mesma forma que o cmd.exe ou o Cygwin. Ele não reimplementa as funções especificadas e certamente não é comparável ao Perl.

É "apenas" um shell, mas facilita a programação, fornecendo uma interface confortável para o universo .NET.

Lembre-se também de que o PowerShell requer Windows XP, Windows Server 2003 ou superior, o que pode representar um problema, dependendo da sua infraestrutura de TI.

Atualizar:

Eu não tinha ideia de que tipo de debate filosófico minha resposta provocaria.

Postei minha resposta no contexto da pergunta: Compare o PowerShell ao Cygwin, Perl e Bash.

O PowerShell é um shell, pois não faz diferença sintática entre comandos internos, comandos, funções do usuário e comandos externos (.exe, .bat, .cmd). Chamar apenas métodos .NET diferem adicionando um espaço para nome ou um objeto na chamada.

Sua capacidade de programação deriva da estrutura .NET, não de nada específico da "linguagem" do PowerShell.

Eu diria que acredito que o PowerShell é uma "linguagem de script" assim que o Bugzilla ou o MediaWiki são implementados como scripts do PowerShell em execução em um servidor Web;)

Até lá, aproveite as comparações .

devio
fonte
Sim, acho que quando estou falando sobre o "shell" do Unix, também estou me referindo a todos os utilitários normais que acompanham o Unix, como grep, awk, etc. Estou apenas me perguntando se o PowerShell oferece utilitários semelhantes fora -a Caixa.
Andy White
3
Powershell não é "apenas uma concha". É uma linguagem de script. Gostaria de saber de que forma não é comparável ao perl? Admito que não é tão maduro, mas além disso não vejo a disparidade.
EBGreen 21/02
@ EBGreen, o que exatamente você quer dizer com este comentário? Concordo que qualquer linguagem de script ou shell é inerentemente semelhante, mas eu estava pensando mais sobre os recursos específicos do PowerShell vs. bash / perl / outras linguagens de script / shell do unix.
Andy White
2
O Powershell possui uma gama incrivelmente ampla de funções. É - Um shell interativo e composível - Uma rica linguagem de script interativa - Uma linguagem de programação Possui um rico conjunto de funções do utilitário OO e tesxt (isto é, equivalentes ao grep / awk / etc).
Jeffrey Snover - MSFT
11
@ Andy - eu entendi Devio dizer que o PowerShell não é tão poderoso quanto o Perl. Não acredito que isso seja verdade e apenas me perguntei por que ele pensava que era esse o caso.
EBGreen
4

Os cmdlets no PowerShell são muito agradáveis ​​e funcionam de maneira confiável. A orientação a objetos deles me atrai muito, já que sou desenvolvedor Java / C #, mas não é de todo um conjunto completo. Como é orientado a objetos, perdeu muito da maturidade do fluxo de texto do conjunto de ferramentas POSIX ( awke sedpara citar alguns).

A melhor resposta que encontrei para o dilema de amar técnicas OO e amar a maturidade nas ferramentas POSIX é usar as duas! Um ótimo aspecto do PowerShell é que ele realiza um excelente trabalho de canalização de objetos para fluxos padrão. O PowerShell, por padrão, usa um pipeline de objetos para transportar seus objetos. Esses não são os fluxos padrão (saída padrão, erro padrão e entrada padrão). Quando o PowerShell precisa passar a saída para um processo padrão que não possui um pipeline de objetos, ele primeiro converte os objetos em um fluxo de texto. Como faz isso tão bem, o PowerShell é um excelente local para hospedar ferramentas POSIX!

O melhor conjunto de ferramentas POSIX é o GnuWin32 . Demora mais de 5 segundos para instalar, mas vale a pena, e até onde eu sei, não modifica seu sistema (registro, c:\windows\*pastas, etc.), exceto a cópia de arquivos para os diretórios que você especificar. Isso é muito interessante, porque se você colocar as ferramentas em um diretório compartilhado, muitas pessoas poderão acessá-las simultaneamente.

Instruções de instalação do GnuWin32

Faça o download e execute o exe (é do site SourceForge ) apontando-o para um diretório adequado (eu vou usar C:\bin). Ele criará um GetGnuWin32diretório no qual você executará e download.bat, em seguida install.bat(sem parâmetros), após o qual, haverá um C:\bin\GetGnuWin32\gnuwin32\bindiretório que é a pasta mais útil que já existiu em uma máquina Windows. Adicione esse diretório ao seu caminho e você estará pronto para começar.

Expiação limitada
fonte
4

TL; DR - Eu não odeio o Windows ou o PowerShell. Eu simplesmente não consigo fazer nada no Windows ou no PowerShell.


Pessoalmente, ainda acho o PowerShell na melhor das hipóteses.

  • a conclusão da guia dos caminhos do diretório não é composta, exigindo que o usuário insira um separador de caminho após cada conclusão do nome.
  • Eu ainda me sinto como o Windows não tem sequer o conceito de um caminho ou do que um caminho é, sem acessível ao usuário indicador de casa ~/curta de alguns@environment://somejibberish/%user_home%
  • O NTFS ainda está uma bagunça e, aparentemente, sempre será. Boa sorte para navegar.

  • interface cmd-esque, o dinosaur cmd.exe ainda está visível no PowerShell, EditarMarcar ainda sendo a única maneira de copiar informações e copiar somente na forma de blocos retangulares do espaço visível do terminal. e Editar Marcar ainda sendo a única maneira de colar seqüências de caracteres no terminal.

  • Pintá-lo de azul não o torna mais atraente. Não me importo que os desenvolvedores da Microsoft tenham um gosto colorido.

  • O Windows sempre abre no canto superior esquerdo da tela. Para alguém que usa barras de tarefas verticais, isso é incrivelmente irritante, especialmente considerando que a barra de tarefas do Windows cobrirá o único canto da janela que dá acesso à funcionalidade de copiar / colar.

Não posso falar muito com base nas ferramentas que o Windows inclui. Sendo que existe um conjunto inteiro de ferramentas CLI de código aberto e licenciadas gratuitamente, e o PowerShell é fornecido, pelo que sei, nenhuma delas é uma decepção absoluta.

  • PowerShell's wget leva argumentos aparentemente incomparáveis ​​para o GNU wget. Obrigado, vislumbre de esperança portável - inútil.
  • O PowerShell POSIX não é compatível com Bash, principalmente o &&operador não é tratado, tornando o comando condicional mais simples.

Eu não conheço homem; Eu tentei, realmente fiz; Ainda tento tentar, na esperança de que da próxima vez que o abrir, seja menos inútil. Não posso fazer nada no PowerShell e mal consigo fazer coisas com um projeto real para trazer as ferramentas GNU para o Windows.

O MySysGit me fornece o prompt do dinosaur cmd.exe com algumas ferramentas GNU, e ainda é muito desanimador, mas finalmente a conclusão do caminho funciona. E o comando Git será executado no Git Bash.

O Mintty for MySysGit fornece à interface do Cygwin o ambiente do mysysgit, tornando uma coisa para copiar e colar (selecione para copiar (mouse), Shift+ Inspara colar, quão moderno ...). No entanto, coisas comogit push estão quebradas em Mintty.

Não pretendo reclamar, mas ainda vejo grandes problemas com a usabilidade da linha de comando no Windows, mesmo com ferramentas como o Cygwin.


PS: Só porque algo pode ser feito no PowerShell, não o torna utilizável . A usabilidade é mais profunda que a capacidade e é o que tento focar ao tentar usar um produto como consumidor.

ThorSummoner
fonte
Ativar o modo QuickEdit? Selecione e pressione Enter para copiar, ctrl-v para colar, não mais Edit-> Mark ou Edit-> Paste. Enquanto estiver nas preferências, defina a posição da janela e desmarque a opção "deixar a janela da posição do sistema". O preenchimento de guias não é apenas o preenchimento de caminhos do sistema de arquivos, mas também o preenchimento de nomes de variáveis, nomes de comandos, propriedades de objetos; você pode digitar .ou [acessar uma propriedade ou índice, portanto, não pode adicionar apenas um separador de caminhos no final. Qual PowerShell wget, exatamente? Qual PowerShell POSIX? Não está tentando trazer ferramentas gnu para o Windows ou ser compatível com o bash.
TessellatingHeckler
Sim, eu sei que não está tentando ser festança. Abstive-me de dizer isso no post original. Eu diria que w fica binário, mas não existe um comando "qual" no power shell :( não me lembro onde compro e li o poder O Shell deveria ser compatível com POSIX
ThorSummoner
5
re: "não qual" -> (get-command wg*.exe).Path. Re: bash conclusão e linha de leitura -> leeholmes.com/blog/2012/09/13/… levando a github.com/lzybkr/PSReadLine
TessellatingHeckler
2

Não vi que o PowerShell realmente decolou, pelo menos ainda não. Portanto, pode não valer a pena o esforço de aprendê-lo, a menos que os outros da sua equipe já o conheçam.

Para sua situação, você pode se sair melhor com uma linguagem de script que outras pessoas podem adotar, Perl como você mencionou, ou outras como Ruby ou Python.

Eu acho que muito disso depende do que você precisa fazer. Pessoalmente, tenho usado o Python para meus próprios scripts pessoais, mas sei que quando começar a escrever algo que nunca poderei transmitir - por isso tento não fazer algo muito revolucionário.

greg
fonte
2

Por que não usar os dois? Chame scripts do PowerShell no Cygwin como qualquer outro script interpretado como Perl, etc.

Eu faço isso o suficiente para escrever https://bitbucket.org/jbianchi/powershell para um wrapper Bash chamar o powershell.exe no Cygwin. Ele pode ser usado como um shebang como a primeira linha de um script .ps1 do powershell.exe (já que o PowerShell também usa "#" como comentário). Veja https://bitbucket.org/jbianchi/powershell/wiki/Home para exemplos

johnnyB
fonte
1

Em algumas linhas, Cygwin e PowerShell são ferramentas diferentes; no entanto, se você tiver o Cygwin instalado, poderá executar os executáveis ​​do Cygwin em uma sessão do PowerShell. Eu me acostumei tanto ao PowerShell que agora não uso mais grep, sort, awk, etc. Existem várias alternativas internas no PowerShell e, caso contrário, você pode encontrar um cmdlet por aí.

A principal ferramenta que me vejo usando é o ssh.exe, mas em uma sessão do PowerShell.

Isso funciona muito bem.

yaxzone
fonte
0

Achei que a programação do PowerShell não vale o esforço.

Tenho vários anos de experiência com scripts de shell no Unix, mas achei extremamente difícil fazer muita coisa com o PowerShell.

Parece que muitas funções exigem que você interrogue a Interface de Gerenciamento do Windows e emita comandos semelhantes a SQL para obter as informações necessárias.

Por exemplo, eu queria escrever um script para remover todos os arquivos com um sufixo específico de uma árvore de diretórios. No Unix, isso seria um simples ...

find . -name \*.xyz -exec rm {} \;

Depois de algumas horas brincando com Scripting.FileSystemObjecte WScript.Shellemitindo "SELECT * FROM Win32_ShortcutFile WHERE Drive = '" & drive & "' AND Path = '" & path =' "& searchFolder &" '", finalmente desisti e aceitei a Pesquisa do Windows Explorer de comando e faça-o manualmente. Provavelmente, há alguma maneira de fazer o que eu queria, mas não vi nada óbvio e todos os exemplos no site do MSDN eram tão triviais que não tinham valor.

EDIT Heh, é claro que, assim que escrevi isso, examinei um pouco mais e descobri o que estava perdendo: a -recurseopção para o comando remove-item está com defeito (revelada se você usar get-help remove-item -detailed).

Eu estava tentando "remove-item -filter '* .xyz' -recurse" e não estava funcionando, então desisti.

Acontece que você precisa usar get-childitem -filter '*.xyz' -recurse | remove-item

TMN
fonte
16
Acho que você está confundindo o Windows Scripting Host (WSH) com o PowerShell. Eles são totalmente diferentes.
Erik Funkenbusch 22/02/09
3
Como exemplo, se você deseja excluir todos os arquivos que terminam em .TMN, pode emitir este comando get-childitem c: \ -include * .TMN -recurse | foreach ($ _) {remove-item $ _. fullname}
Erik Funkenbusch 22/02/09
@ Mystere: Eu tentei isso, e não parecia funcionar. Depois de algum futzing sobre, parece que * .tmn é o que você precisa (em vez de apenas .tmn)
redtuna
5
Eu não poderia respeitosamente discordar mais e não sou de modo algum um cara do Windows. Acho PS muito mais fácil de roteirizar do que bash. PS é mais consistente. Com o Bash, qualquer utilitário de console que você invocar tem sua própria sintaxe e comportamento exclusivo, e a própria sintaxe do bash é bastante enigmática. O PS é muito mais robusto com recursos de linguagem como funções anônimas (blocos de script), validação de parâmetros, funções avançadas etc. Além de conceitos de módulos para portabilidade e muitos outros recursos. Principalmente, porém, o maior motivo é o que você sempre ouve sobre PS, os objetos superam o texto. Bash ainda é mais rápido.
usar o seguinte comando
0

O PowerShell é muito poderoso, mais poderoso do que os built-ins padrão dos shells do Unix (mas apenas porque inclui grande parte da funcionalidade geralmente concedida aos subprogramas). Além disso, considere que você pode escrever applets em qualquer linguagem .NET, incluindo IronPython , IronRuby , PerlNet, etc .. ou você pode simplesmente chamar seus comandos Cygwin de PowerShell, ignorando todas as funcionalidades extra e ele vai trabalhar de forma semelhante ao Bash, KornShell , como queiras...

Erik Funkenbusch
fonte
Eu acho que você pode estar perdendo os objetivos de design dos shells do Unix. Não batendo no PowerShell (gostaria de aprender mais eu mesmo), mas você precisa entender as ferramentas do Unix para fazer uma declaração como essa.
Jé Queue
2
@ Xepoch - Não, acho que você está perdendo os objetivos de design do PowerShell. O PowerShell pode fazer tudo o que os shells do Unix podem fazer da mesma maneira que fazem. No entanto, o poder real ocorre quando você utiliza o sistema de tubulação de objetos do PS em vez de apenas analisar a saída de texto. Portanto, o PowerShell pode fazer exatamente o que o bash ou o korn podem fazer, mas eles não podem fazer o que o PowerShell pode fazer.
Erik Funkenbusch
3
Eu simplesmente não conheço o PowerShell o suficiente para fazer uma crítica, mas como você sabe claramente os objetivos dos shells do Unix não são necessariamente uma substituição totalmente abrangente das ferramentas externas, mas das estruturas de controle em torno delas. Mais uma vez, neste momento, não posso comparar nem contrastar, mas elevar o PowerShell porque ele tem mais recursos internos não é necessariamente o benefício dos shells do Unix.
Jé Queue
@ Xepoch - O ponto é que você pode escolher o caminho que deseja fazer. Você pode usar toda a bondade do shell interno ou pode ignorar e fazê-lo da maneira que o Unix faz. É a sua escolha. E a escolha é boa, certo?
Erik Funkenbusch