Скрипт Powershell для замены строк именем файла - PullRequest
0 голосов
/ 30 января 2012

Как записать имя файла (базовое имя, а не полное имя) в тот же файл, заменив строку, присутствующую в файле.По сути, у меня есть куча файлов .psf в папке с именем C: \ Downloads \ PreValidation.

  1. Я хочу изменить каждый файл на формат .csv и
  2. во время выполненияпоэтому я хочу заменить строку с именем «Space Planning Project», присутствующую в одной из записей файла, на имя файла без расширения.

Это сценарий, который я пытаюсь запустить -

foreach($file in (dir C:\Downloads\PreValidation\*.psf)){
$fromdir = "C:\Downloads\Prevalidation\*.psf"
$fullname = gi $fromdir| select fullname
$b = $fullname[0]
$b.fullname
Copy-Item $file.fullname C:\Downloads\Validation\WIP\psaload1.csv
Get-Content C:\Downloads\Validation\WIP\psaload.csv | ForEach-Object {$_.replace("Space Planning Project","$b.fullname")} | Set-Content C:\Downloads\Validation\WIP\psaload.csv 
}

но выдает ошибку: 1011 *

 Get-Content : Cannot find path 'C:\Downloads\Validation\WIP\psaload.csv' because it  does not exist.
 At C:\cap_sps\powershell\testfilename.ps1:7 char:12
 + Get-Content <<<<  C:\Downloads\Validation\WIP\psaload.csv | ForEach-Object  {$_.replace("Space Planning Project","$b.fullname")} | Set-Content C:\Downloads\Validation\WIP\psaload.csv
+ CategoryInfo          : ObjectNotFound: (C:\Downloads\Validation\WIP\psaload.csv:String) [Get-Content], ItemNotF
oundException
 + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

Обратите внимание, что я использую свой последний файл psaload.csv для загрузки в базу данных Oracle, и на последнем шаге моего сценария я удаляю этофайл, так что я могу запустить те же команды в цикле для остальных файлов .psf, присутствующих в вышеуказанной папке.

Любая помощь очень ценится.

Спасибо, Сандерс.

Ответы [ 2 ]

4 голосов
/ 30 января 2012

В вашем коде много избыточности, с dir в цикле и последующим использованием файла для получения элемента снова.Также вы копируете в один и тот же файл csv для каждого из файлов psf, и в строке копирования упоминается файл psaload1.csv, но вы пытаетесь получить содержимое psaload.csv, что приводит к появившейся ошибке.1005 * Попробуйте что-то вроде этого (я делаю некоторые предположения здесь и не проверялось):

gci C:\Downloads\PreValidation\*.psf | %{
$file = $_
gc $file.fullname | % {$_ -replace "Space Planning Project",$file.BaseName } | Set-Content "C:\Downloads\Validation\WIP\$($file.BaseName).csv"
}
0 голосов
/ 30 января 2012

Чтобы получить BaseName файлового объекта, используйте свойство BaseName. Вы можете изменить свой скрипт так:

$files = gi $fromdir| select fullname,basename
$fullname = $files[0].fullname
$b = $files[0].basename

Что касается сообщения об ошибке, вы пытаетесь получить содержимое файла, который не существует. Ваша копия строки

Copy-Item $file.fullname C:\Downloads\Validation\WIP\psaload1.csv

имеет "1" в имени файла, но в следующей строке ваше имя файла для Get-Content не имеет.

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