Powershell foreach 语句不起作用

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 变量路径的书写方式,但得到了相同的结果

答案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 之间的所有空格都是空格。所以我编辑了我的列表以删除每个用户名后面的所有空格,之后它就正常工作了。

相关内容