Не работает Powershell foreach

У меня есть оператор foreach, который просматривает список имен пользователей и помещает каждое имя в путь, указанный ниже, затем копирует и вставляет файл в папку запуска отдельных пользователей. По какой-то причине я получаю сообщение об ошибке, что часть пути не была найдена. Есть идеи, в чем может быть проблема?

#for each username folder copy the a file to the users startup folder
foreach ($_ in $usernames)
{
$destination = "C:\users\"+ "$_" + "\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
Copy-Item -Path c:\temp\file.bat -destination $destination -force
}

Я попытался изменить способ написания пути к моей переменной $destination, и я получил те же результаты

2 ответа

Пара проблем с этим:

1) foreach ($_ in $usernames), Это действительно плохая практика - пытаться внедрить переменную конвейера и в лучшем случае может быть непредсказуемым. Вместо этого попробуйте что-то вроде ForEach($username in $usernames)

2) ваша строка для сборки $destination мог бы сделать с лучшим форматированием. попробуй что-то вроде $destination = "'C:\users\$username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup'"

3) Отступы - облегчают чтение

Собрав все воедино, вы получите что-то вроде:

foreach ($username in $usernames)
{
    $destination = "'C:\users\$username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup'"
    Copy-Item -Path c:\temp\file.bat -destination $destination -force
}

Для дополнительных очков:

  • поместите файл, который вы копируете, в переменную для более легкой модификации или повторного использования

  • добавьте обработчик ошибок и убедитесь, что путь существует, прежде чем пытаться скопировать

Затем вы получите что-то похожее на это:

$sourceFile = "C:\temp\file.bat"
foreach ($username in $usernames)
{
    $destination = "'C:\users\$username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup'"
    if (Test-Path $destination) {
        try {
            Copy-Item -Path $sourceFile -destination $destination -force
            Write-Host "Copy Completed"
        } catch {
            Write-Host "Copy to $destination Failed"
        }

    } else {
        Write-Host "$destination Does Not Exist"
    }
}

Теперь вам сообщат, если каждая копия удастся, не удастся, потому что путь не существует, или сбой, потому что копия не удалась (доступ запрещен или аналогичный)

Ну это интересно. Я посмотрел на сообщение об ошибке, которое снова гласит:

Copy-Item : Could not find a part of the path 'c:\users\
                                                Public\AppData\Roaming\Micros oft\Windows\Start Menu\Programs\Startup'

Поэтому я понял, что все пространство между c:\users\ и Public было просто пробелом. Поэтому я отредактировал свой список, чтобы удалить все пробелы после каждого имени пользователя, и после этого он работает.

Другие вопросы по тегам