PowerShell - копирование файла в несколько мест

5

Мне нужна помощь с простым скриптом 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" была недавно добавлена, поскольку каталоги не создавались. Я немного потерян, чтобы быть совершенно честным. Я все еще новичок в синтаксисе и что не уверен, что с этим делать.

Тим П.
источник
Хорошо, так где же вы застряли? Пожалуйста, отредактируйте свой вопрос и опубликуйте код того, что вы уже сделали, и объясните, какие части не работают должным образом - это поможет сузить вопрос до чего-то большего, чем просто другой запрос сценария (который не по теме).
Ƭᴇcʜιᴇ007
1
ХОРОШО! Получил аккаунт и может комментировать. Редактирование сделано.
Тим П.
Вы, вероятно, хотите select-object -ExpandProperty Name. Я бы посоветовал вам запустить свой скрипт в PowerShell ISE. Установите точки останова на разных строках и проверьте переменные, чтобы увидеть, выглядит ли то, что вы ожидаете.
dangph
Вам также не хватает открывающей скобки "{" после foreach ($UserFolder in $Userfolders).
dangph
С этими двумя изменениями это определенно делает больше. В настоящее время он записывает в папку Public и текущий пользователь (при запуске с ПК). Это будет выдвигаться и запускаться и LOCALSYSTEM и иметь полные права администратора для добавления файла в любую пользовательскую папку. Тем не менее, как я могу предотвратить его добавление в отмеченные учетные записи? Как добавить отмеченные точки останова для мониторинга кода? В заключение, я бы хотел проверить диск ОС вместо предположения C: \ - я знаю, что я также могу проверить архитектуру ОС (XP, 7 и т. Д.), Но хочу начать медленно! Спасибо за помощь dangph на том, чтобы заставить его работать.
Тим П.

Ответы:

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"

Шон Мелтон
источник
Я попробую завтра утром. Спасибо за объяснение того, что команды делают также - это помогает узнать, как именно они работают, что является бонусом для меня.
Тим П.
Это сработало отлично. С тех пор я немного расширил это для других требований. Последний вопрос - можно ли разрешить PowerShell разрешать запись во все учетные записи пользователей? Он проходит правильно, но не может получить доступ к другим учетным записям (даже если я администратор). Есть ли способ заставить это работать как LOCAL_SYSTEM или получить дополнительные привилегии?
Тим П.
Вы выполняете сценарий через консоль администратора или групповую политику?
Шон Мелтон
В настоящее время этот сценарий упаковывается с необходимыми файлами и выполняется через пакетный файл, который вызывает powershell.exe следующим образом: powershell.exe -ExecutionPolicy Bypass -File "Java Install.ps1" Мы устанавливаем Java только на некоторых компьютерах в нашем сеть, где это необходимо. На данный момент все это облегчает работу для конечных пользователей, желающих установить Java, или для студентов, изучающих нашу работу, которые менее знакомы с внутренними настройками Java.
Тим П.
При вызове его из командного файла следуйте этому вопросу, есть несколько вариантов на выбор, чтобы получить повышенный привилегированный stackoverflow.com/questions/7690994/…
Шон Мелтон