首页 > 解决方案 > 外壳 | 从文件名的 CSV 列表中复制项目,登录同一个 CSV

问题描述

美好的一天 Powershell 用户

我有一个简单的脚本,它读取带有单列文件名列表的 CSV(第一行标题称为name,列表名称不带扩展名),然后在源路径中搜索它们,然后将这些文件复制到另一个目标路径。

CSV 示例

Name
FV_2017_12_161207
FV_2017_12_161208
FV_2017_12_161209
FV_2017_12_161210
.
.
.

它工作正常,但为了在文件不存在的情况下保持记录,我添加了一个带有 TXT 文件的 Start-Transcript/Stop-Transcript。

这是我的代码:

$source = "\\192.168.1.3\anexos\"
$endpath = ".\seleccion\"
$LogFile = "errorlog.txt"
Start-Transcript -path $LogFile -append
Import-Csv list.csv | ForEach-Object {
    Copy-Item $source$($_.name).pdf $endpath
}
Stop-Transcript

它完成了工作,但我想更进一步。

如果文件是否成功复制,是否有办法为每一行写入相同的 CSV 列表?

CSV 示例

Name               Copy
FV_2017_12_161207  Ok
FV_2017_12_161208  Fail
FV_2017_12_161209  Fail
FV_2017_12_161211  Ok
FV_2017_12_161212  Ok
FV_2017_12_161213  Ok
.
.
.

非常感谢任何改进我简陋代码的帮助和提示,谢谢!

标签: powershelllogging

解决方案


这将非常容易!我们真正需要做的就是在您尝试复制文件之前添加一个检查以查看文件是否存在,我会在Test-Path此处执行此操作。

Import-Csv list.csv | ForEach-Object {
    if (Test-Path $_.Name){
        #FileExists
        Copy-Item $source$($_.name).pdf $endpath
    }
}

然后,我们将创建一个 PSObject 来跟踪我们复制了文件。

ForEach-Object {
    if (Test-Path $_.Name){
        #file exists
        Copy-Item $source$($_.name).pdf $endpath
        [pscustomobject]@{FileName=$_.Name;Copied=$true}
        }
}

最后一步是添加一个else{}脚本块,如果我们无法复制文件,则创建一个对象。

 ForEach-Object {
    if (Test-Path $_.Name){
        #file exists
        Copy-Item $source$($_.name).pdf $endpath
        [pscustomobject]@{FileName=$_.Name;Copied=$true}
        }
    else{
        #no
        [pscustomobject]@{FileName=$_.Name;Copied=$false}
        }

}

这就是它在行动中的样子。

FileName        Copied
--------        ------
v.vbs             True
WorkingHinv.mp4   True
DoesntExist.Not  False
test.xlsx         True

您还可以将结果存储在一个数组中,然后在最后显示该数组,然后存储为 CSV 以进行记录。

只需$Array=@()在代码开头添加,然后$array+=在每一[pscustomobj]...行之前添加。然后,您可以通过运行保存它

$array | Export-CSV .\CopyLog.Csv

推荐阅读