我正在尝试使用测试路径来查找路径或路径/文件是否有效。
例如我可以这样做:
test-path -literalpath "c:\MyFolder\Study Setup.csv"
如果是,则返回 true;如果不是,则返回 false。
现在,这是我的问题,我对循环一无所知。理想情况下,我希望 Powershell 读取文件“Study Setup.csv”,其中包含一个名为 PATH 的列,并检查此列中每个记录的文件路径是否有效。
如果不是,则输出无效的路径。
除了一行程序之外,我在 Powershell 方面的经验非常有限,因此循环和许多东西一样陌生。
我知道这不是代码编写服务,但他非常感谢任何帮助。
答案1
我认为你甚至不需要任何循环,你只需要Where-Object
Import-CSV "C:\MyFolder\Study Setup.csv" | Where-Object { !(Test-Path $_.Path) }
Test-Path
这将只返回返回的对象$false
对于导出,我会选择这个,因为我想要所有的 CSV 属性,而不仅仅是路径:
Import-CSV "C:\MyFolder\Study Setup.csv" | Where-Object { !(Test-Path $_.Path) } | Export-CSV "C:\MyFolder\False Paths in Study Setup.csv"
但如果你真的只想要路径,你可以这样做:
Import-CSV "C:\MyFolder\Study Setup.csv" | Where-Object { !(Test-Path $_.Path) } | Select-Object -ExpandProperty Path | Out-File "C:\MyFolder\False Paths in Study Setup.txt"
答案2
在 PowerShell 中有几种循环方法,请参阅有关该主题的帮助文件。 尝试这个...
Import-Csv -Path "$PWD\Study Setup.csv" |
ForEach-Object {
If (-Not (Test-Path -Path $PSItem.Path))
{$PSItem.Path | Out-File -FilePath "$PWD\BadPaths.csv" -Append -WhatIf}
Else {"The path $($PSItem.Path) already exists"}
}
# Results
<#
The path D:\Temp already exists
What if: Performing the operation "Output to File" on target "D:\Scripts\BadPaths.csv".
What if: Performing the operation "Output to File" on target "D:\Scripts\BadPaths.csv".
#>
如果一切看起来不错,则删除 -WhatIf 以完成运行。
仅供参考,当然,PowerShell 提供了许多方法来执行 X 或 Y。这是一种确定文件夹、文件等是否存在的不同方法。这完全取决于选择、代码风格等。
答案3
未经测试,但感觉很自大 :D
$Source = 'c:\MyFolder\Study Setup.csv'
$BadPaths = 'c:\MyFolder\BadPths.txt'
If ( test-path -literalpath $Source ) {
( Import-Csv $Source ).Path | ForEach{
If ( -not ( test-path -literalpath $_ )) {
'"{0}"' -f $_
}
}
} | Add-content $BadPaths
我喜欢 SImonS 关于 的提醒Wheere-Object
。我会以这种方式合并它(并假设我们可以相信该$Source
文件存在):
Filter Quote-String { '"{0}"' -f $_ }
$Source = 'c:\MyFolder\Study Setup.csv'
$BadPaths = 'c:\MyFolder\BadPths.txt'
( Import-Csv $Source ).Path | Where{
-not ( Test-Path -LiteralPath $_ )
} | Quote-String | Add-Content $BadPaths