цикл foreach для копирования файла во все каталоги в c:users … надеюсь, простой

#powershell #powershell-ise

#powershell #powershell-ise

Вопрос:

Цель: мне нужно скопировать и вставить фоновые команды во все профили пользователей на множестве машин Ошибка: путь не существует. Я не могу понять проблему, почему мой путь C:usersuser1Appdata превращается в C:Users1 Users2Appdata Пользователи 2Appdata

Вот полный код:

 $Folders = Get-ChildItem -Directory "C:Users"   | Where-Object {$_.Name -notlike "Public"}  | Where-Object {$_.Name -notlike "AppData"}
$Backgrounds = "\Server1Teams-Backgrounds*"



Foreach($Folder in $Folders) {

Copy-Item -Path $Backgrounds -Destination "C:Users$($Folders.Name)AppDataRoamingMicrosoftTeamsBackgroundsUploads" -Force -ErrorAction Stop

}

  

Комментарии:

1. $($Folders.Name) подразумевается $($Folder.Name) . Вы пытаетесь сделать это для всей коллекции, а не для одного объекта в цикле foreach.

2. Да… Один из тех моментов, когда вы говорите себе «Это был долгий день».

3. Совет — никогда не использовать множественные элементы вашей коллекции в циклах. Например, Foreach($Item in $Folders) или Foreach($Dir in $Folders)

Ответ №1:

Это то, что вам нужно.

 # Combined the Where-Object filter into a single
$Folders = Get-ChildItem -Directory "C:Users" | Where-Object {($_.Name -notlike "Public") -and ($_.Name -notlike "AppData")}
$Backgrounds = "\Server1Teams-Backgrounds*"

Foreach($Folder in $Folders) {
    # Changed $Folders.Name to $Folder.Name
    Copy-Item -Path $Backgrounds -Destination "C:Users$($Folder.Name)AppDataRoamingMicrosoftTeamsBackgroundsUploads" -Force -ErrorAction Stop
}