Um guia de boas-vindas ao PowerShell contém os equivalentes do PowerShell dos comandos pwd
, cd
, ls
, find
, cp
, rm
, mkdir
, touch
, cat
, tail
, grep
, uname
, mkfs
, , ping
, man
e cut
:
https://mathieubuisson.github.io/powershell-linux-bash/
Além disso, é possível encontrar equivalências adicionais de outros comandos de linha de comando, como which , where , alias , wget , curl , type , %0 e até mesmo command overriding .
No entanto, ainda estou tendo problemas para descobrir como fazer uma for
declaração simples no Powershell. Por exemplo, o seguinte agruparia todos os arquivos com base no nome do arquivo, assumindo que cada nome de arquivo tenha um equivalente .txt:
set b=0
for %a in (*.txt) do set /a b=!b!+1 > NUL & echo (!b!) & dir /b %~na.*
Qual é o equivalente no PowerShell? O comando
ls *.txt | ForEach-Object {Split-Path -LeafBase -Path $_.Name}
lista os arquivos. No entanto, como passo o nome do arquivo para o dir /b %~na.*
comando? Parece que assim que fecho as chaves do comando For-Each-Object, os resultados querem passar como uma aglomeração, ao invés de poder processá-los uma linha por vez. E se eu adicionar outra camada ao redor do Split-Path, então ele $_
acaba sendo um objeto diferente, então não é possível separar o nome do arquivo da extensão.
EDIT: Existe uma maneira melhor de analisar os resultados um de cada vez? O for
comando foi sugerido nos comentários; Só tenho dificuldade em descobrir como fazer com que ele processe todo o arquivo *.txt; mas se isso fosse possível, talvez esse fosse o caminho a seguir?
A preferência é fazer isso a partir da linha de comando, sem precisar gravar em um arquivo, se possível.
A versão do PowerShell
for
é genérica, mais próxima das linguagens de programação – ela não faz loop em arquivos especificamente, mas em listas arbitrárias , o que significa que você precisa de outro comando para produzir uma lista de arquivos.(Isso é algo para desaprender ao passar do Cmd para qualquer outra coisa – às vezes não há equivalências porque toda a arquitetura é diferente.)
dir
akagci
akaGet-ChildItem
funciona para esse propósito – embora executá-lo sozinho exiba uma tabela sofisticada, na realidade o resultado é um objeto que só se torna texto quando mostrado:Canalize-o para ForEach-Object para obter o loop:
O valor da iteração atual é sempre,
$_
embora você possa atribuí-lo a uma variável personalizada dentro do bloco.Outra maneira de escrever o loop é usar um
foreach {}
bloco mais tradicional, como em muitas linguagens de programação:Nesse caso, Get-ChildItem não retorna apenas uma lista de nomes de arquivos; ele retorna objetos com propriedades. Por exemplo,
$_.FullName
contém o caminho completo do arquivo (e que você pode usar com Split-Path se necessário), enquanto$_.Name
é apenas o nome.O equivalente a
%~na
é igualmente genérico e não depende de forma alguma dofor
loop.Como acontece com qualquer outro comando do PowerShell, apenas executá-lo exibirá os resultados em stdout (como você fez em seu próprio código), mas você pode atribuí-los a uma variável:
o que pode então ser feito como parte de um loop:
Da mesma forma, qualquer comando pode ser usado diretamente como uma substituição, como as variáveis podem, usando
$(...)
, se você quiser tudo em uma linha: