Diariamente, os administradores de sistemas precisam executar diversas operações padrão nos inúmeros arquivos e pastas de seus servidores Windows . Essas tarefas geralmente envolvem o gerenciamento de dados de usuários em recursos compartilhados e a garantia de backups adequados. Para reduzir a quantidade de trabalho manual envolvida, você pode usar o PowerShell.
Neste artigo, você aprenderá como usar o PowerShell para:
- Mostrar objetos em um diretório
- Crie arquivos e pastas
- Excluir arquivos e pastas
- Copiar arquivos e pastas
- Mover arquivos ou diretórios
- Renomear arquivos
- Alterar extensões de arquivo
- E muito mais
Antes de começar, certifique-se de que sua política do sistema permite executar scripts do PowerShell.
Mostrar objetos em um diretório
Para visualizar o conteúdo de um diretório em um servidor de arquivos Windows, use o cmdlet Get-ChildItem . Para exibir todos os arquivos ocultos, adicione o parâmetro -Force. O comando a seguir exibe todos os objetos raiz na pasta "Shared".
Aqui você pode aprender sobre: Correção: A atualização não se aplica ao seu dispositivo
- Get-ChildItem -Force \\ fs \ Compartilhado
Se você também quiser ver todas as subpastas e seus conteúdos, adicione o parâmetro -Recurse:
- Get-ChildItem -Force \\ fs \ Shared -Recurse
Para filtrar os resultados, adicione os parâmetros Filter, Exclude, Include e Path ao cmdlet Get-ChildItem . Para filtragem avançada de objetos, use o cmdlet Where-Object . O script abaixo pesquisa todos os arquivos executáveis no arquivo TI que foram modificados após 1º de abril de 2018.
- Get-ChildItem -Path \\ fs \ Shared \ IT -Recurse -Include * .exe | Where-Object -FilterScript {($ _.LastWriteTime -gt '2018/04/01')}
Crie arquivos e pastas com PowerShell
Para criar novos objetos com o Windows PowerShell, você pode usar o cmdlet New-Item e especificar o tipo de item que deseja criar, como um diretório, arquivo ou chave de registro.
Este comando, por exemplo, cria uma pasta:
- New-Item -Path '\\fs\Shared\NewFolder' -ItemType Diretório
E isso cria um arquivo vazio:
- Novo-Item -Path '\\fs\Shared\NewFolder\newfile.txt' -ItemType Arquivo
Crie arquivos e grave dados neles
Existem pelo menos dois métodos integrados para criar um arquivo e gravar dados nele. O primeiro é usar o cmdlet Out-File :
- $text = 'Olá, mundo!' | Arquivo de saída $text-FilePath C:\data\text.txt
Para substituir um arquivo existente, use o parâmetro switch –Force. Você também pode criar arquivos com o cmdlet Export-Csv, que exporta o resultado para um arquivo csv que pode ser aberto no Excel:
- Get-ADuse -Filtro * | Exportar-Csv -Caminho C:\data\ADusars.csv
Crie arquivos depois de verificar se eles ainda não existem
O script a seguir verifica se um arquivo específico (pctxt) já existe em uma determinada pasta. Se o arquivo ainda não existir, o script gera uma lista de todos os computadores do Active Directory e a salva em um novo arquivo chamado pctxt.
# cria uma série de arquivos de texto
$arquivos = Get-ChildItem C:\dados\*. txt | selecione -expandir nome completo
# verifica se o arquivo existe em string
$ arquivos -match “pc.txt”
# se a correspondência retornar "True", saia, se retornar "False", crie um relatório
if ($arquivos -eq 'Falso') {
Get-ADComputer -Filtro * | Exportar-Csv -Caminho C:\data\pc.txt
}
mais {sair}
Exclua arquivos e pastas com PowerShell
Para remover itens, use o cmdlet Remove-Item. Você deve ter em mente que será solicitada uma confirmação em tempo de execução se o objeto não estiver vazio. O exemplo a seguir mostra como excluir a pasta IT, todas as suas subpastas e os arquivos que ela contém:
Delete-Element-Path '\\fs\shared\it\'
Confirmar
O elemento em \\ pdc \ shared \ possui filhos e o parâmetro Recurse não foi especificado. Se você continuar, todos os filhos serão removidos junto com o elemento.
Tem certeza de que deseja continuar?
[S] Sim [A] Sim para todos [N] Não [L] Não para todos [S] Suspender [?] Ajuda
(o padrão é “Y”):
Se você já verificou que todos os objetos em uma pasta devem ser excluídos, você pode usar a opção? Fallback para pular a etapa de confirmação:
- Delete-Item -Path '\\ fs \shared \it \' -Recurse
Exclua arquivos e pastas com mais de X dias
Às vezes é necessário limpar arquivos antigos de um diretório específico. Veja como fazer esta tarefa:
$Pasta = “C:\Backups”
#remove arquivos com mais de 30 dias
Get-ChildItem $Folder -Recurse -Force -ea 0 |
? {! $_. PsIsContainer -e $_. LastWriteTime -lt (Get-Date).AddDays (-30)} |
ForEach-Object {
$ _ | -Vigor
$_. Nome Completo | Arquivo de saída C:\log\deletedbackups.txt -Append
}
Exclua arquivos após verificar se eles existem
Veja como verificar se um arquivo existe e excluí-lo, se existir:
$NomeArquivo = 'C:\data\log.txt'
If (Caminho de teste $NomedoArquivo) {
Excluir elemento $FileName
}
Exclua arquivos em vários computadores com um único script
Para excluir arquivos em computadores remotos, você deve ter permissões de segurança para acessá-los. Certifique-se de usar caminhos UNC para que o script determine corretamente a localização dos arquivos.
$filelist = @(«\c$\Temp», «\c$\Backups”) # variável para exclusão de arquivos e pastas
$computerlist = Get-Content C:\data\pc.txt # obtém lista de computadores remotos
foreach ($computador em $lista de computadores) {
foreach ($arquivo em $listadearquivos){
$filepath = Join-Path «\\$computer\» «$filelist» # gera caminhos unc para arquivos e pastas
if (caminhoteste $caminhodoarquivo)
{
Excluir elemento $filepath -force -recurse -ErrorAction Continue}}}
Copie arquivos e pastas com PowerShell
O cmdlet Copy-Item permite copiar objetos de um caminho para outro. O comando a seguir cria um backup copiando o arquivo usars.xlsx de um computador remoto (fs) e salvando-o em outro computador (fs2) na rede:
- Copiar item -Caminho\\ fs\Shared\it\usas.xlsx -Destino\\ fs2\Backups\it\usas.xlsx
Se o arquivo de destino já existir, a tentativa de cópia falhará. Para substituir o arquivo existente, mesmo que seja somente leitura, use o parâmetro -Force.
- Copiar Item -Caminho\\ fs\Shared\it\usas.xlsx -Destino\\ fs2\Backups\it\usas.xlsx -Force
Copie arquivos com o PowerShell para ou de um computador remoto
Se você estiver copiando arquivos de ou para computadores remotos, use caminhos UNC.
Por exemplo , use este comando para copiar arquivos de um servidor de arquivos remoto para o diretório C: local:
- Copiar elemento \\ fs \ c $ \ temp -Recurse C: \ data \
Para copiar arquivos do seu diretório local para a pasta remota, basta inverter os locais de origem e destino:
- Copie o item C:\data\-Recurse\\fs\c$\temp
Copie vários arquivos de um servidor para outro pela rede usando um script
Você também pode copiar arquivos de um servidor remoto para outro. O script a seguir copia recursivamente a pasta \\fs\Shared\temp para \\fs\Shared\test :
- Copiar elemento \\ fs \ Shared \ temp -Recurse \\ fs \ Shared \ test
Copie apenas determinados tipos de arquivos
Para copiar apenas determinados arquivos da origem para o destino, use o parâmetro -Filter. Por exemplo, o comando a seguir copia apenas arquivos txt de uma pasta para outra:
- Copiar elemento -Filter *.txt -Path \\ fs \ Shared \ it -Recurse -Destination \\ fs2 \ Shared \ text
Copie arquivos usando comandos XCOPY e ROBOCOPY ou objetos COM
Você também pode executar os comandos XCOPY e ROBOCOPY para copiar arquivos ou usar objetos COM, como no exemplo a seguir:
- (New-Object -ComObject Scripting.FileSystemObject).CopyFile('\\fs\Shared', 'fs2\Backup')
Mova arquivos e diretórios com PowerShell
O cmdlet Move-Item move um item, juntamente com suas propriedades, conteúdo e filhos, de um local para outro. Ele também pode mover um arquivo ou subdiretório de um diretório para outro.
O comando a seguir move um arquivo de backup específico de um local para outro:
- Mover-Item -Caminho \\ fs \ Compartilhado \ Backups \ 1.bak -Destino \\ fs2 \ Backups \ arquivo \ 1.bak
Este script move toda a pasta Backups e seu conteúdo para outro local:
- Mover-Item -Caminho \\ fs \ Compartilhado \ Backups -Destino \\ fs2 \ Backups \ arquivo
O diretório Backups e todos os seus arquivos e subpastas aparecerão no diretório de arquivos.
Renomear arquivos com Powershell
O cmdlet Rename-Item permite renomear um objeto sem modificar seu conteúdo. Não é possível mover itens usando o comando Rename-Item. Para isso, você precisa usar o cmdlet Move-Item, conforme explicado anteriormente.
O seguinte comando renomeia um arquivo:
- Renomear elemento -Caminho «\\ fs \Shared \temp.txt» -NewName «new_temp.txt»
Renomear vários arquivos
Para renomear vários arquivos simultaneamente, use um script como este:
$files = Get-ChildItem -Path C:\Temp #cria lista de arquivos
foreach ($arquivo em $arquivos)
{
$newNomeArquivo = $file.Name.Replace("A", "B") #substitua "A" por "B"
Renomear elemento $file $newFileName
}
Edite extensões de arquivo com PowerShell
Você também pode usar o cmdlet Rename-Item para alterar as extensões de arquivos. Se você quiser alterar as extensões de vários arquivos ao mesmo tempo, use o cmdlet Rename-Item com o cmdlet Get-ChildItem.
O script a seguir altera todas as extensões de arquivo de “txt” para “bak”. O caractere curinga (*) é usado para incluir todos os arquivos de texto:
- Get-ChildItem \\ fs \ Compartilhado \ Logs \ *. Texto | Renomear item - Novo nome {$_. Nome - Substitua '\.txt$', '. Assado
Get-Content – Como ler o conteúdo de um arquivo no PowerShell?
O cmdlet Get-Content é um dos comandos obrigatórios ao analisar scripts do PowerShell. Isso permitirá que você leia o conteúdo de um arquivo no PowerShell, o que é uma ação muito comum. Além de ler os dados, podemos importá-los para uma variável para usar no script do PowerShell. Você pode usar Get-Content para recuperar o conteúdo de um arquivo de log, por exemplo.
Veremos que o cmdlet Get-Content é poderoso e capaz de fazer mais do que simplesmente recuperar todo o conteúdo de um arquivo, daí o interesse em dedicar um artigo inteiro a ele. Este cmdlet funciona no Windows PowerShell 5.1 e no PowerShell, incluindo a versão mais recente até o momento: PowerShell 7.1.1.
II. Basta ler o conteúdo de um arquivo
Para começar, vamos simplesmente ler o conteúdo de um arquivo de texto contendo uma lista de valores. Para acompanhar esta parte do tutorial, crie um arquivo chamado " Paystxt " e salve-o em " C:\TEMP ". Este arquivo deve conter o seguinte:
- Brasil
- Costa Rica
- Bélgica
- suíço
- Espanha
- Colômbia
- Canadá
- Brasil
- Islândia
- Nicarágua
Etapas para ler o conteúdo no Powershell
- Passo 1: Para ler e exibir o conteúdo deste arquivo no console, o comando é super simples, pois basta especificar o nome do arquivo (ou o caminho completo se não estiver no diretório atual):
- Passo 2: Você obtém o conteúdo «C:\TEMP\Paga txt»
- Passo 3:O parâmetro -Caminho será usado implicitamente para este valor. Se escrevermos o comando abaixo, é a mesma coisa.
- Get-Content -Path «C:\TEMP\Pays txt»
NOTA : Exibir o conteúdo no console não é muito útil. É mais interessante quando armazenamos o conteúdo do arquivo em uma variável para podermos utilizá-lo posteriormente. Tudo o que você precisa fazer é criar uma variável, por exemplo, `$Country` , e atribuir a ela o conteúdo do arquivo como valor.
- $Country = Get-Content «C:\TEMP\Pays txt»
Por curiosidade, podemos analisar o tipo da variável $Country após atribuirmos um valor a ela:
- $País.GetType()
Podemos ver que obtemos duas informações relevantes : " Object[] " e " System.Array ". Estamos lidando com um objeto na forma de uma matriz de valores; isso é interessante!
Para contar o número de elementos neste arquivo de texto, podemos fazer isso de duas maneiras diferentes:
- $Paga.Contagem
- ($Country | Objeto de medição).Contagem
Como se trata de uma matriz, temos 10 elementos ; o primeiro valor corresponde ao índice 0 e o último ao índice 9 (já que temos apenas 10 elementos). Portanto, o valor no índice 0 será "França" e o valor no índice 9 será "Nicarágua".
Se quiser consultar o valor encontrado no índice 0, ou seja, o primeiro valor, é muito simples:
- $ País [0]
Ou se preferir, tudo se resume a fazer:
- (Obter conteúdo “C:\TEMP\Pays txt”) [0]
Na mesma linha, para recuperar o último valor sem saber o número exato do índice, existe um truque! Basta usar "-1" como número do índice:
- (Obter conteúdo “C:\TEMP\Pays txt”) [-1]
Em vez de recuperar o conteúdo do arquivo como uma matriz, podemos recuperá-lo como uma única string. Basta adicionar o parâmetro -Raw ao comando:
- Get-Content -path «C:\TEMP\Pays txt» -raw
Continuemos com alguns exemplos práticos.
III. O cauda de Linux no estilo PowerShell
No Linux , é muito comum usar o comando `tail` para exibir as últimas linhas de um arquivo . Eu o uso frequentemente para consultar um arquivo de log, principalmente porque a saída é dinâmica: se linhas forem adicionadas ao arquivo, elas serão exibidas no console conforme o processo avança.
É muito prático, e é possível fazer o mesmo no PowerShell, usando o cmdlet Get-Content e uma opção chamada -Tail e uma segunda opção -Wait !?
Sem a opção -Wait, podemos recuperar as últimas X linhas de um arquivo usando apenas -Tail. Por exemplo, para recuperar as últimas 5 linhas do nosso arquivo Pays.txt:
- Get-Content «C:\TEMP\Paga txt» -Tail 5
Agora, se quisermos exibir as últimas 5 linhas e esperar para recuperar as futuras linhas adicionadas ao arquivo, usaremos esta sintaxe:
- Get-Content «C:\TEMP\Pays txt» -Tail 5 -wait
Para testar isso, execute o comando acima e, em seguida, modifique o arquivo " Pays txt " para adicionar uma linha: você a verá exibida quase em tempo real no console do PowerShell onde o comando é executado.
Na verdade, com o comando `-Wait` , o `Get-Content` mantém o arquivo aberto e verifica a cada segundo se há conteúdo novo. Para encerrar o comando, basta pressionar " CTRL + C ".
Você deve estar ciente de que pode usar a opção -Wait only : nesse caso, o arquivo inteiro será exibido no console e permanecerá pendente.
- Get-Content «C:\TEMP\Paga txt» -Aguarde
4. Obtenha as primeiras X linhas de um arquivo
Da mesma forma, podemos recuperar as primeiras linhas de um arquivo. Nesse caso, não usaremos -Tail, mas sim -TotalCount . Novamente, você precisa especificar o número de linhas a serem exibidas.
- Get-Content «C:\TEMP\Paga txt» -TotalCount 5
Por outro lado, e logicamente, a opção -Wait não é útil com a opção -TotalCount.
V. NTFS: Veja um sequência segredo em um arquivo
O sistema de arquivos NTFS é único por possuir diferentes " fluxos " para armazenar dados. Quando dados são gravados em um arquivo, eles são armazenados no fluxo $DATA . Portanto, quando acessamos o arquivo, lemos o conteúdo desse fluxo de dados.
Além disso, podemos ver que nosso arquivo " Pays txt " possui esse fluxo graças ao comando Get-Item:
- Obtenha o elemento "C:\TEMP\Pays txt" -Stream*
Notamos também que o console retorna apenas esse fluxo de dados.
O melhor de tudo é que você pode criar sua própria transmissão para ocultar os dados!
Basta adicionar dados ao nosso arquivo " Pays.txt ", especificando a sequência em que os dados devem ser enviados. Por exemplo, vamos criar o fluxo " Credenciais " com o valor " Senha ".
- Add-Content -Path «C:\TEMP\Pays txt» -Stream Creds -Value «Senha»
Agora, se exibirmos novamente a lista de transmissões em nosso arquivo, obteremos uma nova entrada:
Se nos divertirmos exibindo o conteúdo do nosso arquivo, veremos que o valor “Senha” que acabei de adicionar ao arquivo não aparece.
- Obter conteúdo "C:\TEMP\Pays txt"
Além disso, para consultar o fluxo padrão, você pode especificar seu nome após o parâmetro -Stream do Get-Content (preste atenção à sintaxe):
- Get-Content «C:\TEMP\Pays txt» -Stream ':$DATA'
Se você quiser exibir o conteúdo do fluxo "Credenciais" que criamos anteriormente, basta dizer o seguinte:
- Obter conteúdo "C:\TEMP\Pays txt" -Stream Creds
O comando retornará um único valor: Senha
A prova na imagem abaixo:

É bom saber, mas não devemos pensar que seja uma solução milagrosa para ocultar senhas ou dados confidenciais. Na verdade, você pode verificar seu sistema com ferramentas específicas ou com o cmdlet Get-ChildItem em busca de arquivos que possuam um fluxo adicional além do padrão $DATA.
Está um pouco fora do assunto, mas para realizar esta análise a partir de uma pasta em execução como ponto de partida:
- Get-ChildItem-Recurse | ForEach{Get-Item$_. FullName -Stream *} | Onde -ne' é transmitido: $Data'
Este comando irá recuperar o nosso arquivo Pays.txt e transmitir "Credenciais?". É muito provável que os documentos do Office também sejam destacados na saída do comando com uma sequência chamada " Zone.Identifier ". Esta sequência contém um ID que permite ao sistema saber a zona à qual este arquivo pertence ( intranet, internet, etc., em oposição às zonas do IE).
Você pode se interessar em ler sobre: Como corrigir o alto uso da CPU causado pelo Searchindexer.exe
Conclusão
Como você pode ver, é assim que você pode gerenciar seus arquivos com o PowerShell. Seguindo as instruções deste artigo, você pode automatizar diversas operações simples de gerenciamento de arquivos em seus sistemas de armazenamento e economizar tempo para se dedicar a tarefas mais importantes. Esperamos que esta informação tenha sido útil.
Meu nome é Javier Chirinos e sou apaixonado por tecnologia. Desde que me lembro, eu gostava de computadores e videogames e esse hobby acabou virando um emprego.
Publico sobre tecnologia e gadgets na Internet há mais de 15 anos, especialmente em mundobytes.com
Também sou especialista em comunicação e marketing online e tenho conhecimento em desenvolvimento WordPress.