Como gerenciar arquivos com Powershell

Última atualização: 04/10/2024
Como gerenciar arquivos com Powershell

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

  QNodeOS: O sistema operacional que pode revolucionar as redes quânticas

}

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
  Solução para erro Kernel-Power 41 no Windows 11

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

  1. 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):
  2. Passo 2: Você obtém o conteúdo «C:\TEMP\Paga txt»
C:\TEMP\Paga txt
C:\TEMP\Paga txt
  1. Passo 3:O parâmetro -Caminho será usado implicitamente para este valor. Se escrevermos o comando abaixo, é a mesma coisa.
    1. 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()
Como gerenciar arquivos com Powershell
$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]
"C:\TEMP\Paga txt") [-1]
«C:\TEMP\Paga 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
Get-Content -path "C:\TEMP\Pays txt" -raw
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
  O que é um arquivo .APE? Para que serve e como abrir um

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.

Get-Content "C:\TEMP\Paga txt" -TotalCount 5
Get-Content «C:\TEMP\Paga txt» -TotalCount 5

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.

C:\TEMP\Paga txt" -Stream *
C:\TEMP\Paga txt»-Stream*

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:

Add-Content -Path "C:\TEMP\Pays txt" -Stream Creds -Value "Senha"
Add-Content -Path «C:\TEMP\Pays txt» -Stream Creds -Value «Senha»

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:

Add-Content -Path "C:\TEMP\Pays txt" -Stream Creds -Value "Senha"

É 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.