Apesar da linha de comando padrão do Windows ser o CMD, temos também no Windows 7 e posteriores, a opção de usar o PowerShell, que conta com outros comandos, especialmente para administradores de sistema.
Esses são os comando mais comuns do Powershell:
Get-ChildItem
- Mostra o conteúdo do diretório atual (podendo usar -Directory
para listar só pastas ou -File
para listar só arquivos, além de parâmetros como *.txt
.Set-Location C:\Users
- Move entre diretórios.Get-Location
- Mostra diretório atual.New-Item arquivo/pasta
- Cria um arquivo ou diretório (colocar -Type Directory
para pastas).Get-Content arquivo
- Lê o arquivo na linha de comando do Powershell.Rename-Item nomeantigo nomenovo
- Renomeia um arquivo ou diretório.Select-String palavra arquivo
- Encontra uma linha num arquivo..Move-Item arquivo C:\Users
- Move o arquivo para outro diretório especificadoCopy-Item arquivo C:\Users
- Copia o arquivo para outro diretório especificadoRemove-Item arquivo/pasta
- Remove o arquivo ou pasta especificado.Get-History
- Mostra o histórico de comandos.Write-Output "Frase"
- Para escrever na tela (pode ser omitido usando somente o conteúdo).Read-Host "Frase"
- Pede que o usuário digite um dado, para guardar numa variável.#
- Para comentários.Get-Help
- Exibe a ajuda (para um comando, use -?
).Start-Sleep 60
- Pausa o Powershell por um tempo especificado, em segundos.Clear-Host
- Limpa a tela.Clear-History
- Limpa o histório de comandos.Start-Process nomedoprograma
- Abre um programa ou arquivo.Stop-Process 0000
- Encerra um processo baseado no seu PID, use o parâmetro -Force
para forçar o encerramento (para obter, use Get-Process
).Get-Alias
- Exibe a lista de comandos do Powershell e seus alias.Get-Host
- Exibe a versão do Powershell.É possível navegar pelas chaves do registro pelo Powershell digitando Set-Location HKCU:
(pode ser HKCR, HKLM, HKU e HKCC), para voltar ao sistema de pastas, digite Set-Location C:
.
Para exibir os dados da BIOS do computador, digitamos Get-WmiObject -Class Win32_BIOS -ComputerName $env:COMPUTERNAME
.
Para vermos os processos que mais usam memória, usamos o comando Get-Process | Sort-Object –p ws | Select-Object –Last 5
.
Para listar os programas instalados no PC, usamos o comando Get-WmiObject -Class Win32_Product | Select-Object -Property Name
.
Para escrever um conteúdo no arquivo, fazemos igual no CMD, usando o Write-Output ou outro comando que imprima alguma saída. por exemplo Get-ChildItem >> arquivo.txt
(pode ser necessário dar um espaço entre os comandos).
PS: Usando dois >> ele adicionará uma nova linha no arquivo, caso exista, se usar um só > ele sobrescreverá o arquivo existente.
Para criarmos variáveis, usamos o cifrão no começo delas, por exemplo:
# Criando uma variável:
$variavel
# Atribuindo valor:
$variavel = "Olá Mundo"
# Exibindo:
Write-Output $variavel
Para usar as variáveis de ambiente do Windows em comandos, use o $env:
antes dela, por exemplo:
Write-Output $env:SystemRoot
Set-Location $env:UserProfile
É possível fazermos contas no Powershell também, digitando diretamente as contas (como 10 + 5
).
PS: Muitos comandos do CMD funcionam também no Powershell, ou até mesmo alguns do Unix (para executar um arquivo, por exemplo, usamos algo como ./arquivo.exe
), esses são alias para os comandos mais longos.
Para criar um arquivo de script powershell, basta salvar ele no formato ps1 e colocar os comandos, mas geralmente os sistemas são configurados para não rodar esse tipo de script, para desbloquear isso use o comando Set-ExecutionPolicy RemoteSigned
no Powershell, executando como administrador, para bloquear novamente use Set-ExecutionPolicy Restricted
.
Para gerar hashs de arquivos pelo Powershell, use esses comandos:
Get-FileHash nomedoarquivo.extensão -Algorithm md5 | Format-List
Isso mostrará o hash no Powershell, de acordo com o algoritmo escolhido (MD5, SHA1, etc). Para salvá-lo em um arquivo de texto, faça o seguinte:
Get-FileHash nomedoarquivo.extensão -Algorithm md5 | Format-List > arquivo.txt
Essas são as variáveis do sistema (usadas com $env:
):
Variável | Conteúdo Exibido |
---|---|
USERPROFILE | C:\Users\UsuarioAtual |
PROGRAMDATA | C:\Programdata |
ALLUSERSPROFILE | C:\Programdata |
WINDIR | C:\Windows |
SYSTEMROOT | C:\Windows |
PROGRAMFILES | C:\Program Files |
COMMONPROGRAMFILES | C:\Program Files\Common Files |
USERNAME | "UsuarioAtual" |
COMPUTERNAME | Nome do Computador |
LOCALAPPDATA | C:\Users\Usuário Atual\AppData\Local |
APPDATA | C:\Users\Usuário Atual\AppData\Roaming |
USERDOMAIN | Nome do Computador |
SYSTEMDRIVE | C: |
HOMEDRIVE | C: |
SYSTEMDIRECTORY | C:\Windows\System32 |
COMSPEC | C:\Windows\System32\cmd.exe |
TEMP | C:\Users\Usuário Atual\AppData\Local\Temp |
TMP | C:\Users\Usuário Atual\AppData\Local\Temp |
HOMEPATH | \Users\Usuário Atual |
PATH | Retorna o path do sistema |
PATHEXT | Retorna as extensões de executáveis |
OS | Retorna o nome do Sistema Operacional |
PROCESSOR_IDENTIFIER | Retorna dados sobre o processador |
PROCESSOR_ARCHITECTURE | Retorna a arquitetura do processador |
PS: Em sistemas 64 bits, a variável PROGRAMFILES
é referente a pasta de aplicações 64 bits, para acessar a pasta de aplicações 32 bits, use PROGRAMFILES(x86)
. O mesmo vale para a COMMONPROGRAMFILES
, que em aplicativos de 32 bits é COMMONPROGRAMFILES(x86)
. Nesses casos, coloque tudo entre aspas.
Para "grudar" mais de um comando no Powershell, use o ponto-e-vírgula.
O Powershell tem os tipos baseados no .NET, e são vários tipos, e todos eles são objetos, ou seja, eles tem propriedades e métodos.
Digitando Get-Item .\arquivo.txt
Podemos ver os dados do arquivo especificado. Ele cria um objeto no Powershell baseado nesse arquivo. Dessa forma, podemos atribuir a uma variável assim:
$arq = Get-Item .\arquivo.txt
# Visualizando métodos do arquivo:
$arq | Get-Member -MemberType Methods
# Visualizando propriedades do arquivo:
$arq | Get-Member -MemberType Property
# Nome do arquivo:
$arq.Name
# Extensão do arquivo:
$arq.Extension
# Nome simples do arquivo:
$arq.Basename
# Tipo do objeto:
$arq.GetType()
Isso aí acima, é pra acessar métodos e propriedades de um objeto. Para métodos e atributos estáticos, usamos ::
, por exemplo:
[string]::Join("-", @("instituto", "de", "scripts"))
[string]::Join("-", @("instituto", "de", "scripts")).GetType()
[string]::Format("{0} {1} {2}", "instituto", "de", "scripts")
PS: Para formatar valores float, faça assim, colocando a quantidade de casas com zeros:
$real = 12345.6789
Write-Host ([string]::Format("{0:0.00}", $real))
PS: Quando usar numa exibição, coloque tudo entre parênteses para exibir.
Podemos também usar os métodos diretamente na string, ao invés do objeto, por exemplo:
"Instituto de Scripts".ToUpper()
"Instituto de Scripts".ToLower()
"Instituto de Scripts".Replace(" ", "-")
"Instituto de Scripts".Length
Os métodos são vários, além desses, por exemplo:
[int]"1"
([int]"1").GetType()
Não dá para converter uma string para char, exceto quando for um array de char, por exemplo:
[char[]]"HAL"
([char[]]"HAL").GetType()
# Isso mostra o número ASCII corresponde a mesma letra:
[int[]][char[]]"HAL"
Com um foreach incrementando:
[int[]][char[]]"HAL" | foreach {
# Underline é o item atual:
$_ + 1
}
Reconvertendo para char e depois string:
[string][char[]]([int[]][char[]]"HAL" | foreach {
# Underline é o item atual:
$_ + 1
})
Outro exemplo:
[string][char[]]([int[]][char[]]"VMS" | foreach {
# Underline é o item atual:
$_ + 1
})
PS: Podemos alterar a variável do sistema $ofs
para inserir algum conteúdo entre as letras, o padrão é o "".
Podemos fazer contas com datas, por exemplo esta que mostra quantos dias faltam pro Natal:
[Datetime]"12/25/2020" - [Datetime]::Now
Os tipos primitivos mais comuns são [int]
, [single]
(equivalente ao float) e [string]
, mas existem outros como já vistos. Os números de ponto flutuante são usados com pontos, como na maioria das linguagens.
Geralmente os números de ponto flutuante são reconhecidos como double, por exemplo:
(1.25).GetType()
Isso acontece porque o double tem maior precisão de casas decimais que o single/float.
Temos outras funções para trabalhar com strings, como a Replace
(que substitui algo na string), e a Concat
da classe String, que concatena algo. Veja o uso delas:
$frase = "Isso é uma String"
Write-Host $frase.Replace("String", "Frase") # Substitui algo
Write-Host ([string]::Concat($frase, " e ela foi concatenada!")) # Concatena com mais algo
Para inverter strings, fazemos assim:
$frase = "Isso é uma String"
$novo = [char[]]$frase
[array]::Reverse($novo)
$frase = [string]($novo -join '')
Write-Host $frase
Para remover espaços desnecessário de strings, basta usar o Trim
, assim:
$texto = " Exemplo de String! "
Write-Host $texto.Trim()
Para transformar todas as letras em maiúsculas e minúsculas, use os métodos ToUpper()
e ToLower()
do objeto, respectivamente:
$frase = "Isso é uma String"
Write-Host $frase.ToUpper() # Converte pra maiúscula
Write-Host $frase.ToLower() # Converte pra minúscula
# Com char fazemos assim:
Write-Host ([char]::ToUpper('s'))
Para ver a quantidade de caracteres de uma string, use o atributo Length
do objeto, assim:
$frase = "Exemplo de String"
Write-Host -NoNewLine "Quantidade de caracteres: " $frase.Length "`n"
PS: Note que o -NoNewLine
faz o Write-Host não pular de linha.
Basicamente, existem vários tipos de operadores no Powershell.
Veja como é realizada uma contagem de 1 até 10 no Powershell:
# Conta de 1 até 10:
1..10
Para substituir os nomes de um arquivo de texto por alguma palavra, podemos fazer assim:
(Get-Content .\teste.txt) -replace "(pal1|pal2)", "SUBSTITUTO" > novo.txt
Podemos fazer um vetor com números de 1 a 10, assim:
$vetor = 1..10
$vetor
E consequentemente, podemos verificar se um conteúdo está dentro do vetor ou não:
$vetor = 1..10
$vetor -contains 6
$vetor -contains 11
E também verificar se os dados é de um determinado tipo:
"WPS" -is [int]
"WPS" -is [string]
E também converter dados:
("07/08/2035").GetType()
"07/08/2035" -as [Datetime]
("07/08/2035" -as [Datetime]).GetType()