Удаление содержимого файла после успешного завершения

#windows #powershell #powershell-2.0 #powershell-3.0

#Windows #powershell #powershell-2.0 #powershell-3.0

Вопрос:

Я хочу запустить одну и ту же команду Powershell для каждого подразделения. Список подразделений приведен в текстовом файле.

 **Powershell command:**
run_script OU1
run_script OU2

**Text File:**
OU1
OU2
...
  

До сих пор я написал следующую логику:

 $OUnames = Get-Content("C:ouNames.txt");
foreach ($OU in $OUnames)
{
    $output = run_script $OU
      if($output -contains "success")
      // then delete $OU from ouNames.txt
      // and inlcude $OU in the file ouNamesAdded.txt
}
  

Как удалить OU из первого текстового файла после run_script $OU возврата success для определенного OU . Кроме того, как добавить $OU в другой файл ouNamesAdded.txt

Как я могу извлечь несколько из, а затем запустить параллельно для нескольких подразделений OU C:ouNames.txt run_script $OU

Комментарии:

1. Очень неясно, что run_script происходит с параметром $OU . Особенно, поскольку, похоже, это содержит только имя, а не DistinguishedName.. Пожалуйста, объясните немного больше и покажите нам соответствующий код.

Ответ №1:

Вот что я приготовил:

     $OUnames = Get-Content("C:ouNames.txt")
foreach ($OU in $OUnames)
{
$output = run_script $OU
  if($output -contains "success")
  {
   $OUs = Get-Content("C:ouNames.txt")
   $OUs -notmatch "$OU" | Out-File "C:ouNames.txt"
   $OU | Out-File "C:ouNamesAdded.txt" -Append
  }
}
  

Этот код будет проходить через текстовый файл и запускать команду «run_script» для каждого из них. В случае успеха он захватит весь текст в файле, который не соответствует успешному подразделению, и запишет его в текстовый файл, эффективно удаляя строку, которая успешно выполнялась. Затем он запишет успешную строку в новый текстовый файл «ouNamesAdded».

Комментарии:

1. Как я могу извлечь несколько из, а затем запустить параллельно для нескольких подразделений OU C:ouNames.txt run_script $OU

2. @meallhour Это сложнее, чем кажется, и у меня нет опыта в этом. Вероятно, вам лучше оставить это как цикл.

Ответ №2:

Для добавления нового содержимого подразделения в новый файл вы можете использовать Add-Content :

 $OU | Add-Content "ouNamesAdded.txt"
  

Для удаления содержимого я бы просто сделал это после завершения цикла. Вы можете удалить -whatif параметр, если вас устраивает команда.

 Compare-Object -ReferenceObject (Get-Content ouNames.txt) -DifferenceObject (Get-Content ouNamesAdded.txt) -PassThru | Set-Content ouNames.txt -whatif
  

Я не знаю ничего, что просто удалит строку из файла. Если вы хотите удалять подразделение из файла после каждой итерации, вам нужно будет сделать что-то вроде следующего:

 # Execute within the if statement
Get-Content ouNames.txt -notmatch "^$OU$" | Set-Content ouNames.txt
# Or using the $OUNames array (more efficient)
$OUnames -notmatch "^$OU$" | Set-Content ouNames.txt
  

Если вы хотите отслеживать список и выполнять удаления в реальном времени, я бы использовал что-то вроде arraylist:

 # Run this before the loop code
$OUs = $OUnames.clone() -as [system.collections.arraylist]
# Run this within the if statement
$OUs.Remove($OU)
# After the loop completes, then write to the output file
$OUs | Set-Content "ouNamesAdded.txt"
  

Комментарии:

1. Как я могу получить несколько подразделений из C:ouNames.txt а затем запустите run_script $OU параллельно для нескольких подразделений

2. Я бы посмотрел на задания PowerShell для параллельного выполнения.