我的Prevalidation文件夹中有许多扩展名为.psa的文件,我想:
对于源文件夹中的所有.psa文件,将重复此操作。
所以,问题是我如何在循环中执行一组命令,而不是现有的.psa文件。
这是我的Prevalidation文件夹中只有一个文件的代码测试 -
Copy-Item C:\Downloads\PreValidation\*.psa C:\Downloads\Validation\WIP
Rename-Item 'C:\Downloads\Validation\WIP\abc 1234.psa' 'psaload1.csv'
Get-Content C:\Downloads\Validation\WIP\psaload1.csv | ForEach-Object { $_.replace("\,"," ") } | Set-Content C:\Downloads\Validation\WIP\psaload.csv
Remove-Item C:\Downloads\Validation\WIP\psaload1.csv
<run the psaload.csv to load to my db>
这就是我打算做的事情 -
在我的C:\ Downloads \ Prevalidation文件夹中考虑多个.psa文件。
For each C:\Downloads\PreValidation\*.psa
BEGIN LOOP
Copy-Item C:\Downloads\PreValidation\aaaa.psa C:\Downloads\Validation\WIP\aaaa.psa
Rename-Item 'C:\Downloads\Validation\WIP\aaaa.psa' 'psaload1.csv'
Get-Content C:\Downloads\Validation\WIP\psaload1.csv | ForEach-Object { $_.replace("\,"," ") } | Set-Content C:\Downloads\Validation\WIP\psaload.csv
Remove-Item C:\Downloads\Validation\WIP\psaload1.csv
END LOOP
我正在寻找为my / prevalidation文件夹中的每个文件逐个运行这些命令的语法。
答案 0 :(得分:5)
由于所有其他答案都是非常糟糕的代码而且不是非常惯用的PowerShell,这是我的看法(尽管未经测试):
# Get all .psa files
Get-ChildItem C:\Downloads\PreValidation\*.psa |
ForEach-Object {
# Load the file's contents, replace commas with spaces
(Get-Content $_) -replace ',', ' ' |
# and write it to the correct folder and file name
Out-File C:\Downloads\WIP\psaload.csv
# I guess you'd run whatever you're doing against the file here,
# not after the loop
Remove-Item C:\Downloads\WIP\psaload.csv
}
答案 1 :(得分:0)
您可以将foreach与Get-Item一起使用来执行循环。 Get-Item将返回FileInfo 您可以用来从中获取文件名(和其他信息)的对象。所以你可以这样做:
foreach($file in (Get-Item .\*.psa))
{
Copy-Item $file.FullName "C:\Downloads\Validation\WIP\$($file.Name)";
}
等
答案 2 :(得分:0)
试试这个:
$a = Get-Item .\*.psa
foreach($file in $a)
{
Copy-Item $file.FullName "C:\Downloads\Validation\WIP\$($file.Name.replace(".psa",".psload.csv)";
remove-item $file
}