Como filtrar compartilhamentos no wmic

1

Eu fundei isso por comando:

wmic share where type=0 get name,path

Eu posso listar os compartilhamentos que me interessam. Não consigo alterar as configurações de compartilhamento ou a permissão de segurança, mas quero fazer o backup deles.

O ponto é - alguém deixou um pouco estranho que dentro de um compartilhamento há outro compartilhamento (pode ser feito com permissão de arquivo, mas não é).

O sistema de arquivos se parece com:

share1
- share1.1
- share1.2
share2
-share2.1
--share2.1.1
--share2.1.2
-share2.2
etc...

Nesse caso, o wmic listará todos os compartilhamentos separadamente e eu os salvarei mais de uma vez.

Alguma ideia de como fazer isso funcionar para verificar apenas o estágio mais alto da árvore de arquivos?

    
por jax 09.12.2016 / 13:16

1 resposta

0

Você pode usar o PowerShell! Salve o script a seguir como um arquivo .ps1 e siga a seção Habilitando scripts em wiki de tags do PowerShell .

$sharepaths = gwmi -Class 'Win32_Share' | ? {-not $_.Name.EndsWith('$')} | % {$_.Path.ToUpperInvariant()} | sort
$lastroot = $null
ForEach ($path In $sharepaths) {
    If ($lastroot -ne $null -and $path.StartsWith($lastroot)) {Continue}
    $lastroot = $path
    # Run backup command here
}

Funciona obtendo todas as instâncias de Win32_Share WMI (como seu arquivo de lote), filtrando-as para aquelas que não terminam em $ (que marca um compartilhamento oculto), extrai apenas as caminho maiúsculo e classifica a lista de caminhos. Essa classificação é importante quando fazemos iterações na lista. Se o caminho atual começar com o caminho do último compartilhamento "raiz", nós o ignoramos, já que já foi feito o backup.

Você precisa substituir a linha de comentário # pelo procedimento que executa o backup. Nesse ponto, a variável $path contém o caminho local para o compartilhamento. Você também pode executar utilitários que não sejam do PowerShell, como xcopy ou robocopy .

Como alternativa, você pode substituir essa linha apenas por $path , que retorna o caminho do compartilhamento atual para o chamador do script. Nessa estratégia, você chamaria o script PowerShell do lote e faria algo com cada linha (isto é, cada caminho) retornado, usando um loop de lote normal. Por exemplo, se você nomeou o script acima shareroots.ps1 , pode executá-lo da seguinte forma:

powershell .\shareroots.ps1
    
por 19.12.2016 / 19:38