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
.
.
.
非常感谢您提供任何改进我谦虚代码的帮助和技巧,谢谢!
答案 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