4

Мне нужна помощь с простым скриптом PowerShell. Я только начинающий с этим языком, так что прости меня за любые ошибки в языке.

Мне нужен сценарий для копирования файла (который находится в том же каталоге, что и сценарий PowerShell) в каждый пользовательский каталог на ПК при запуске, за исключением нескольких. Это предполагается для структур папок Windows 7.

Кодовая идея:

  • Разобрать подкаталоги верхнего уровня в C:\Users
  • Скопируйте элемент с именем deploy.properties в C:\Users\USER_PROFILE_NAME\AppData\LocalLow\Sun\Java\Deployment\ - перезаписать файл, если он существует, и создать структуру папок, если его нет
  • Не делайте этого для учетных записей «Все пользователи», «Администратор» и «По умолчанию»

У меня был своего рода скрипт, который анализировал имена пользователей, но когда он был запущен, он добавлял @ из каждого имени пользователя. Также не удалось создать подкаталоги, если они не существуют. Я чувствую, что это намного проще, чем я это представляю.

Вот что у меня есть для моего кода:

$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
  }

Код не генерирует никаких значимых данных из пользовательских каталогов и выдает ошибки каталога при запуске. Строка "New-Item" была недавно добавлена, так как каталоги не создавались. Я немного потерян, чтобы быть совершенно честным. Я все еще новичок в синтаксисе и что не уверен, что с этим делать.

1 ответ1

3

Это только мои мысли и мнения о том, как я могу это сделать ... и я немного изменил имена переменных, чтобы они соответствовали используемым командлетам. Вы не должны просто сделать это более читабельным для меня.


# 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
    }
}

Как уже отмечалось, я играю с этим на отдельном компьютере, но вывод команд, которые я получаю, находится здесь:


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

Вы также можете получить команду, которая будет выполняться, если вы хотите сначала проверить ее, просто заключив команды в двойные кавычки:"Copy-Item -Path $sFile -Destination $dest -Force"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .