2

Prevalidation フォルダに拡張子が .psa のファイルが多数あり、次のことを行いたいと考えています。

  1. それらを1つずつ作業フォルダーにコピーします
  2. .psa ファイルの名前を psaload.csv に変更します
  3. ファイルに対して一連のコマンドを実行して、データベースにロードします
  4. 次に、csv ファイルを作業フォルダーから削除します。

これは、ソース フォルダーにあるすべての .psa ファイルに対して繰り返されます。

したがって、問題は、存在するすべての .psa ファイルに対して、一連のコマンドをループで実行する方法です。

Prevalidation フォルダー内の 1 つのファイルのみをテストするコードの一部を次に示します。

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

/prevalidation フォルダーに存在する各ファイルに対してこれらの一連のコマンドを 1 つずつ実行するための構文を探しています。

4

3 に答える 3

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
   }
于 2011-11-15T18:08:04.467 に答える
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

}
于 2011-11-15T15:56:44.943 に答える
0

foreach を Get-Item と共に使用して、ループを実行できます。Get-Item は、ファイル名 (およびその他の情報) を取得するために使用できるFileInfo オブジェクトを返します。したがって、次のようなことができます。

foreach($file in (Get-Item .\*.psa))
{
   Copy-Item $file.FullName "C:\Downloads\Validation\WIP\$($file.Name)";
}

于 2011-11-15T15:48:49.960 に答える