#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 для параллельного выполнения.