2015-02-18 2 views
0

Я написал этот скрипт, чтобы найти все папки в каталоге и для каждой папки, проверьте внутри общего файла, если существуют какие-то строки и если они не добавлены. Мне нужно было вставлять строки в определенные места. Не зная, как это сделать, я решил упростить поиск и заменить место, где нужно было вставить строки. В любом случае этот скрипт занимает почти час, чтобы работать через 800 файлов. Я надеюсь, что некоторые опытные участники могут указать, как быстрее выполнить мою задачу, поскольку я работал с Powershell только два дня. Большое спасибо!!!Powershell - Ускорение записи в файлы

# First find and replace items. 
$FindOne = 
$ReplaceOneA = 
$ReplaceOneB = 
$ReplaceOneC = 

# Second find and replace items. 
$FindTwo = 
$ReplaceTwo = 

# Strings to test if exist. 
# To avoid duplicate entries. 
$PatternOne = 
$PatternTwo = 
$PatternThree = 
$PatternFour = 

# Gets window folder names. 
$FilePath = "$ProjectPath\$Station\WINDOW" 
$Folders = Get-ChildItem $FilePath | Where-Object {$_.mode -match "d"} 

# Adds folder names to an array. 
$FolderName = @() 
$Folders | ForEach-Object { $FolderName += $_.name } 

# Adds code to each builder file. 
ForEach ($Name in $FolderName) { 

$File = "$FilePath\$Name\main.xaml" 
$Test = Test-Path $File 

# First tests if file exists. If not, no action. 
If ($Test -eq $True) { 

$StringOne = Select-String -pattern $PatternOne -path $File 
$StringTwo = Select-String -pattern $PatternTwo -path $File 
$StringThree = Select-String -pattern $PatternThree -path $File 
$StringFour = Select-String -pattern $PatternFour -path $File 

$Content = Get-Content $File 

# If namespaces or object don't exist, add them. 
If ($StringOne -eq $null) { 

$Content = $Content -Replace $FindOne, $ReplaceOneA 
} 

If ($StringTwo -eq $null) { 

$Content = $Content -Replace $FindOne, $ReplaceOneB 
} 

If ($StringThree -eq $null) { 

$Content = $Content -Replace $FindOne, $ReplaceOneC 
} 

If ($StringFour -eq $null) { 

$Content = $Content -Replace $FindTwo, $ReplaceTwo 
} 

$Content | Set-Content $File 

} 

} 

# End of program. 
+0

дал 800 файлов, вы на самом деле делает до 3200 поиска/замены пробегов, так как вы обрабатываете каждый файл ** FOUR ** раз в вашей петле ... –

+0

Спасибо за ваш ответ. Любые идеи по упрощению, но достижение того же результата? – OreoRyan

+0

загрузите файл один раз, затем выполните прогон foreach/set-content? никогда не использовались powershell, однако, так что не знаю, нужно ли каждый раз получать содержимое каждый раз, чтобы загружать только что измененные версии. –

ответ

0

Вы можете попробовать написать в файл с потоком, как это

$stream = [System.IO.StreamWriter] $File 
$stream.WriteLine($content) 
$stream.close() 
+0

Привет, я не нашел такого подхода. Я написал, как вы его написали, но заполнял каждый файл строкой и ничего больше «System.Object []»? – OreoRyan

+0

Привет, я использовал «$ Content», и он выводился просто отлично. Однако важно сохранить форматирование текста. Я полагаю, это невозможно с потоковедельцем, и я думаю, даже в том, что вам все равно? Ура! – OreoRyan

+0

Вы все равно можете написать его по очереди, если вам нужно, мой пример был просто простым, чтобы проиллюстрировать эту идею. –

Смежные вопросы