PowerShell - copiando um arquivo para vários locais

4

Preciso de ajuda com um script simples do PowerShell. Eu sou apenas um iniciante com essa linguagem, então me perdoe por qualquer erro na linguagem.

Eu preciso de um script para copiar um arquivo (que está no mesmo diretório que o script do PowerShell) em cada diretório de usuários em um PC quando executado, menos alguns. Isso é assumido para estruturas de pastas do Windows 7.

Idéia do código:

  • Analise os subdiretórios de nível superior em C: \ Users
  • Copie um item chamado deployment.properties para C: \ Users \ USER_PROFILE_NAME \ AppData \ LocalLow \ Sun \ Java \ Deployment \ - sobrescrevendo o arquivo se ele existir e criando a estrutura de pastas, se ela não estiver presente
  • Não faça isso para todos os usuários, administradores e contas padrão

Eu tinha um tipo de script que analisava os nomes dos usuários, mas quando era executado adicionava @ in de cada nome de usuário. Ele também não criou subdiretórios se eles não existissem. Eu sinto que isso é muito mais simples do que eu estou tentando ser.

Isso é o que eu tenho para o meu código até agora:

$UserFolders = get-childitem -path "C:\Users" | ?{$_.Psiscontainer} |select-object fullname
$from = ".\deployment.properties"

foreach ($UserFolder in $Userfolders)
    $to = "C:\Users\$UserFolder\AppData\LocalLow\Sun\Java\Deployment\deployment.properties"
    New-Item -ItemType File -Path $to -Force
    Copy-Item $from $to
  }

O código não gera nenhum dado significativo dos diretórios do usuário e fornece erros de diretório durante a execução. A linha "New-Item" foi adicionada recentemente porque os diretórios não estavam sendo criados. Estou um pouco perdida para ser perfeitamente honesta. Ainda sou novo na sintaxe e não sei o que fazer com isso.

    
por Tim P. 22.11.2013 / 00:04

1 resposta

3

Este é apenas o meu pensamento e opinião sobre como eu poderia fazer isso ... e eu mudei um pouco os nomes das variáveis para que eles correspondam aos cmdlets usados. Você não precisa apenas torná-lo mais legível para mim.


# I don't have a domain computer to work with so my local 
#  PC includes the "public" folder you likely want have 
#  this but nice to include just in case. As well the "Default*" 
#  is there because I'm on Windows 8.1 
#  so the upgrade modified the "Default" folder 
#  to be "Default.migrated" for some reason.

# The "-Exclude" allows you to put in the names of those items (directory names
#   or file names) that you want to exclude, it allows wildcard values as well)
#   Then as suggested in a comment using -ExpandProperty FullName allows the 
#   object to be passed as a string instead of a system object which
#   adds on extra characters that some other cmdlet may not like.
$userFolder = Get-ChildItem -Path 'C:\Users' -Exclude 'Default*','All Users','Administrator', 'Public' | 
   Select -ExpandProperty FullName

# just the file I was playing with here
$sFile = '.\text.txt'


foreach ($uf in $userFolder) {

    $dest = "$uf\AppData\LocalLow\Sun\Java\Deployment\"

# I want to test for the path to exist first and if it 
#  does then add the file, if it does not then you 
#  would create the directory and copy the file. 
#  I noticed in yours that you created an empty 
#  file and then copied it. Works the same way.

    if (Test-Path $dest) {
        Copy-Item -Path $sFile -Destination $dest -Force
    }
    else {
        New-Item -ItemType Directory -Path $dest -Force
        Copy-Item -Path $sFile -Destination $dest -Force
    }
}

Como já foi observado, estou em um computador autônomo que está jogando com isso, mas a saída dos comandos que recebo está aqui:


New-Item -ItemType Directory -Path C:\Users\Shawn\AppData\LocalLow\Sun\Java\Deployment\ -Force
Copy-Item -Path .\text.txt -Destination C:\Users\Shawn\AppData\LocalLow\Sun\Java\Deployment\ -Force

Você também pode gerar o comando que ele executaria se você quiser testá-lo primeiro colocando os comandos entre aspas duplas: "Copy-Item -Path $sFile -Destination $dest -Force"

    
por 23.11.2013 / 20:10

Tags