Удаление содержимого файла после успеха - PullRequest
1 голос
/ 10 апреля 2019

Я хочу запустить одну и ту же команду 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 параллельно для нескольких OU

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

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

    $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» для каждого из них. В случае успеха он захватит весь текст в файлеэто не соответствует успешному OU, и запишите это в текстовый файл, фактически удалив успешно выполненную строку. Затем она запишет успешную строку в новый текстовый файл ouNamesAdded.

0 голосов
/ 10 апреля 2019

Для добавления нового содержимого OU в новый файл вы можете использовать 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

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

# 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"
...