Скрипт Powershell для копирования и переименования файлов в цикле - PullRequest
2 голосов
/ 15 ноября 2011

У меня есть несколько файлов с расширением .psa в папке Prevalidation, и я хочу:

  1. скопируйте их по одному в мою рабочую папку
  2. переименуйте файл .psa в psaload.csv
  3. запустить набор команд для файла, чтобы загрузить его в мою базу данных
  4. и затем удалите файл csv из моей рабочей папки.

Это будет повторяться для всех файлов .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>

Это то, что я собираюсь сделать -

Рассмотрим несколько файлов .psa в моей папке C: \ Downloads \ Prevalidation.

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 ]

5 голосов
/ 15 ноября 2011

Поскольку все остальные ответы представляли собой довольно ужасный код и не очень идиоматичный 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
   }
0 голосов
/ 15 ноября 2011

Попробуйте это:

$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

}
0 голосов
/ 15 ноября 2011

Вы можете использовать foreach с Get-Item для выполнения цикла.Get-Item вернет объект FileInfo , который можно использовать для получения имени файла (и другой информации).Таким образом, вы можете сделать что-то вроде:

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

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...