Powershell脚本,用于在循环中复制和重命名文件

时间:2011-11-15 15:38:34

标签: powershell file-rename

我的Prevalidation文件夹中有许多扩展名为.psa的文件,我想:

  1. 将它们逐个复制到我的工作文件夹中
  2. 将.psa文件重命名为psaload.csv
  3. 对文件运行一组命令以将其加载到我的db
  4. 然后从我的工作文件夹中删除csv文件。
  5. 对于源文件夹中的所有.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文件夹中的每个文件逐个运行这些命令的语法。

3 个答案:

答案 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

}