【发布时间】:2018-03-24 19:04:17
【问题描述】:
我有一个 csv 格式的数字列表,格式如下:
po
123
456
789
我还有一个包含 100 多个文档的目录。我需要检查 csv 中每个字符串的每个文档。如果其中一个数字在其中一个文档中,则需要将其移动到另一个文件中。这是我目前所拥有的:
$files = Get-ChildItem "\\wh1-app\SPS EDI\ARCHIVE IN\*.txt"
foreach ($file in $files) {
$file = Get-Content $file
$pos = Import-Csv -Path C:\Users\ttilton\Desktop\pos.csv -OutVariable string -ErrorAction SilentlyContinue
foreach ($po in $pos) {
$containsWord = $file | %{$_ -match $po.po}
if ($containsWord -contains $true){
write-host $file + " is " + $po.po
#Copy-Item $file C:\Users\ttilton\Desktop\pos\
}
}
但它似乎不起作用。它运行没有错误,但它并没有真正做任何事情。
有什么想法吗?谢谢!!
【问题讨论】:
-
将 ErrorAction 更改为 Stop,这样您就可以看到可能发生的异常。
-
Copy-Item不会被执行,因为#会将整行变成注释。 -
@C.Helling 据我了解,代码
$containsWord是一个布尔值数组。有了你的建议,“f”子句永远是正确的。 -
重用
$file的名称和内容令人困惑,但总的来说我看不出有什么问题。在 PowerShell ISE 调试器中运行它 - 是否找到任何 *.txt 文件? Import-Csv 是否实际导入任何数据?$po.po是否成为您期望的正确数字?你可以用$nums = (import-csv ___).po -join '|'; select-string -pattern $nums -path "\\wh1-app\SPS EDI\ARCHIVE IN\*.txt"做同样的事情 -
@tyTil Select-String 应该明显更快,但是将您的代码更改为使用
$containsWord = $file | ?{$_ -match $po.po} | select -first 1然后检查if ($containsWord)应该会大大减少工作量 - 只测试直到找到第一个东西而不是为每一行保留一些东西。并在每个循环中尝试一些“write-host”,向您显示当前的 $po 和当前 $file,以便您了解它的进展速度。
标签: powershell csv