Разбор и удаление текста с помощью cmd или powershell - PullRequest
2 голосов
/ 15 января 2012

Я проверил немало других вопросов здесь, но не смог найти то, что мне нужно. В настоящее время я пытаюсь автоматизировать процесс определения виртуальных машин и серверов Hyper V. Вот мой текущий сценарий.

@echo off
set /P dc= "Which DC do you want? " 
dsquery computer -name %DC%VUT* > dsquery.txt
type dsquery.txt | findstr /v IMAGINGOU | findstr /v OTHEROU > dsquery2.txt
powershell -command Get-Content dsquery2.txt | ForEach-Object { $_ -replace '"CN=', "" } | Set-Content dsquery3.txt
powershell -command Get-Content dsquery3.txt | ForEach-Object { $_ -replace ',OU=CAM,OU=Exchange,OU=Server,DC=RED001,DC=local"', "" } | Set-Content serverlist.txt
powershell -command .\Get-HyperVMod.ps1 -file output.csv

Проблема, с которой я столкнулся, состоит в том, что серверы, с которых я могу выполнить dsquery (Win2k3), не могут выполнить ForEach-Object, потому что у них есть более старая версия Powershell, а серверы Win2k8, которые могут выполнять ForEach-Object, не могут сделать запрос.

Вот пример вывода dsquery, который я пытаюсь проанализировать и удалить все, кроме имени сервера.

"CN=SERVER001,OU=VUT,OU=Infastructure,OU=Server,DC=dcname,DC=local"
"CN=SERVER008,OU=ImagingWDS,DC=red002,DC=local"

Вывод должен быть

SERVER001
SERVER008

Любые предложения о том, чтобы сделать это другим способом, или просто моя маленькая проблема удаления лишнего текста из файла.

Ответы [ 2 ]

1 голос
/ 14 марта 2012

запустите это для вашего dsquery.txt, он проанализирует то, что вам нужно.

@echo off
setlocal enabledelayedexpansion
::Echos your Computer Name only.
for /F "tokens=1,2 delims==," %%G IN (dsquery.txt) DO echo %%H
pause
endlocal

в основном он использует два разных разделителя: "=" и ",", которые сразу окружают имена вашего сервера,и ищет только этот второй токен.Он работает на основе строк, которые вы указали выше.

0 голосов
/ 15 января 2012

Командлет ForEach-Object был представлен в PowerShell V1, поэтому он у вас будет там.

Регулярное выражение Джона здесь показывает, как можно извлечь общее имя из строки LDAP.

Это будет применять регулярное выражение к каждой строке в текстовом файле и возвращать результат.

Get-Content file.txt | % { $_ -replace '(CN=)(.*?),.*', '$2' }

Обновление Вот как ваш пакетный скрипт будет преобразован в PowerShell:

$dc = Read-Host "Which DC do you want?"
& dsquery computer -name "${dc}VUT*" | % { 
    # Do your processing here...
    $_ -replace '(CN=)(.*?),.*', '$2' 
}
...