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