我有这个 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 变量路径的书写方式,但得到了相同的结果
答案1
存在以下几个问题:
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"
}
}
现在您将被告知每个复制是否成功、由于路径不存在而失败或由于复制失败(访问被拒绝或类似情况)而失败
答案2
这很有趣。我查看了错误消息,内容如下:
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 之间的所有空格都是空格。所以我编辑了我的列表以删除每个用户名后面的所有空格,之后它就正常工作了。