Powershell
Command history
Current:
get-history
Saved:
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
Prompt e perfil
Personalizar o prompt
function prompt {
Write-Host ("[" + $(Get-Location) + "]") -NoNewLine -ForegroundColor 9
Write-Host (" [" + $(Get-Date) + "]") -ForegroundColor 10
Write-Host "<" -NoNewLine -ForegroundColor 0 -BackgroundColor 7
Write-Host " PS " -NoNewLine -ForegroundColor 4 -BackgroundColor 7
Write-Host ">" -NoNewLine -ForegroundColor 0 -BackgroundColor 7
return " "
}
Prompt padrão
function prompt {
Write-Host ("PS " + $(Get-Location) + ">") -NoNewLine
return " "
}
Ver localização do script padrão do usuário local
echo $PROFILE
Editar script e habilitar execução
mkdir $(split-path $PROFILE -parent)
notepad $PROFILE
Set-ExecutionPolicy RemoteSigned
Permissão de execução de scripts
Verificar
Get-ExecutionPolicy
Permitir execução de scripts criados localmente não-assinados ou baixados da internet assinados
Set-ExecutionPolicy RemoteSigned
Manipulando arquivos e strings
Lê o conteúdo de um arquivo e transforma em um array para processamento
Get-Content caminho\arquivo
Lê apenas uma linha de um arquivo
Get-Content -TotalCount 1 caminho\arquivo
Grava o array de entrada na forma de um arquivo de saída
Set-Content caminho\arquivo
Executa o bloco de comandos para cada objeto de entrada e devolve o processamento na saída
Foreach-Object { bloco de comandos }
Representa o objeto atual da entrada, sobre o qual é possível aplicar uma série de processamentos
$_
Atribuir uma string a uma variável
$a = "Um texto qualquer."
Retorna verdadeiro se $a terminar com “qualquer.”
$a -match "qualquer.$"
Faz a substituição de um texto
$a = $a -replace " texto", "a frase"
Concatena 2 strings se $a for tipo string ou soma 2 números se $a for numérico !!!
$c = $a + $b
Extrai um trecho de uma string a partir da 3a. posição (começa com 0) e os próximos 10 caracteres
$sub = $a.substring(2, 10)
Exibindo um valor por linha ou vários valores concatenados
Echo "ABC"
Echo $string
Echo "Cada um" "em uma" "linha"
Echo ("Todos " + "juntos " + "numa " + "só!")
Substituição de texto
Substituir um texto (substitui “velho” por “novo” em um arquivo novo):
Get-Content C:\Caminho\Entrada.txt |
Foreach-Object {$_ -replace "velho", "novo"} |
Set-Content C:\Caminho\Saida.txt
Substituir um texto no mesmo arquivo (os parênteses obrigam a carregar o arquivo primeiro)
(Get-Content C:\Caminho\Mesmo.txt) |
Foreach-Object {$_ -replace "velho", "novo"} |
Set-Content C:\Caminho\Mesmo.txt
Extrair um trecho da primeira linha de uma lista de arquivos:
```ps1
# A lista de arquivo é formatada aqui como um array
( "G:\Meios\Arquivos\0067\processado\conc_full_op_121109_230833.ret",
"G:\Meios\Arquivos\0067\processado\conc_full_rt_130125_021503.ret",
"G:\Meios\Arquivos\0067\processado\conc_full_rt_130130_021704.ret"
) |
Foreach-Object {
# $_ contém o nome do arquivo, armazena-o
$nomearq = $_
# Extrair a primeira linha do arquivo e a substring desejada (começando do 0)
$chave = (Get-Content -TotalCount 1 $nomearq).substring(2,25)
# Concatena e exibe formatado o resultado
Echo ($nomearq + ";" + $chave)
}
Verificando quais arquivos de um diretório contém uma determinada string:
# método 1 (potencialmente mais lento pois busca no arquivo inteiro)
select-string *.cob -simplematch -pattern HD0063, HD0064, HD0065, HD0071, HD0072,
HD19XR, HD19XS, HD19XT, HD19XU, HD19XV, HD19XW, HD19XX, HD19XY, HD19XZ, HD19Y0 |
sort-object -property filename -unique |
select-object filename
# método 2 (deve ser mais rápido pois busca somente na primeira linha do arquivo)
get-childitem *.cob | foreach {
$arquivo = $_
if ( get-content $arquivo -totalcount 1 |
select-string -simplematch -quiet -pattern HD0063, HD0064, HD0065, HD0071, HD0072,
HD19XR, HD19XS, HD19XT, HD19XU, HD19XV, HD19XW, HD19XX, HD19XY, HD19XZ, HD19Y0
)
{
write-output $arquivo.filename
}
} > ..\lista_2011.txt
# grava resultado em um arquivo
Reflexão
Obtendo as propriedades de um objeto. Ex:
$string = "ABC123"
$string | Get-Member -MemberType property
Obtendo os métodos de e um objeto e a definição de um método. Ex:
$string = "ABC123"
$string | Get-Member -MemberType method
$string | Get-Member substring | Select Definition
Listar fontes TrueType instaladas
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$objFonts = New-Object System.Drawing.Text.InstalledFontCollection
$objFonts.Families
Substituto do grep
get-content somefile.txt | where { $_ -match "expression"}
Equivalente de GREP… busca uma linha/padrão em todos os arquivos de uma pasta recursivamente, ignora os erros e grava saída em arquivo .log
get-childitem -recurse C:\Projeto\s-mc\Net\smcsi\smcsi\ | foreach {
get-content $_.fullname | select-string -simplematch -pattern smc_form_select_populate
} 2> out-null > smc_form_select_populate.log
Substituto do sed
powershell -c 'set | %{$_ -replace "^","define ENV_"}'
Trocar cores do console
[console]::ForegroundColor = "Green"
[console]::BackgroundColor = "black"
Listar links de uma página
(wget -Uri "http://www.6502asm.com/examples").Links.Href
Fazer download de um arquivo
wget -uri http://www.example.com/examples/example.txt -outfile example.txt
Primeiro caracter da primeira linha de vários arquivos
get-childitem C:\CAMINHO\*.txt | foreach {
$arquivo = $_
$conteudo = (get-content $arquivo | select -first 1).substring(0, 1)
echo "$arquivo -> $conteudo"
}
Classifica arquivos pelo cabeçalho
get-childitem c:\temp\teste_ps\*.RET | foreach {
$arquivo = $_
$linha = (get-content $arquivo | select -first 1 -skip 1)
$carteira = $linha.substring(20, 2)
$conta = $linha.substring(23, 12)
$dest = ""
echo "arquivo = $arquivo.name"
echo "linha = $linha"
echo "carteira = $carteira"
echo "conta = $conta"
if ( $carteira -eq "02" ) {
if ( $conta -eq "123456789101" ) {
$dest = "//fileserver-matriz/Z:/Sistema123/Arquivo/0505"
}
if ( $conta -eq "987654321012" ) {
$dest = "//fileserver-matriz/P:/Sistema456/Arquivos/Banco/CNAB"
}
}
if ( $carteira -eq "16" ) {
if ( $conta -eq "778899112233" ) {
$dest = "//fileserver-matriz/P:/Sistema789/Arquivo/0505F"
}
}
if ( $dest -ne "") {
# mkdir $dest
# copy-item $arquivo $dest
echo "dest = $dest"
echo "arquivo = $arquivo"
}
}