动力壳|从文件名的CSV列表中复制项目,登录相同的CSV

时间:2018-07-18 15:56:47

标签: powershell logging

Good Day Powershell用户

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

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
.
.
.

非常感谢您提供任何改进我谦虚代码的帮助和技巧,谢谢!

1 个答案:

答案 0 :(得分:2)

这将非常容易!我们真正需要做的就是在检查文件之前添加检查文件是否存在,我将在此处使用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