powershell - 外壳 | 从文件名的 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
.
.
.
非常感谢任何改进我简陋代码的帮助和提示,谢谢!
解决方案
这将非常容易!我们真正需要做的就是在您尝试复制文件之前添加一个检查以查看文件是否存在,我会在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
推荐阅读
- ember.js - Ember:fa-icon 不是助手
- r - 拟合到正态分布后在 10% 尾部找到观测值
- xslt - XSL 显示操作数据值
- android - react-navigation中的React-native android后退按钮
- python - Scipy 和 MATLAB 网格数据的差异
- r - R - 计算概率并翻转累积曲线 (ECDF) 的 x/y 轴
- r - 带有代表其他向量的唯一组合的字母的新向量
- c# - 如何检查无效的 UTF-8 字符?
- python - Python - 将文本从 HTML 文件转换为没有唯一标识符标签的 csv
- python-3.x - 如何使用 ldap3 修改广义时间属性