使用cmd或powershell解析和删除文本

时间:2012-01-15 08:00:05

标签: powershell batch-file cmd batch-processing

我在这里检查了很多其他问题,但无法找到我需要的东西。我目前正在尝试自动查找哪些虚拟机在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

我遇到的问题是我可以做的服务器(Win2k3)的dsquery无法执行ForEach-Object,因为他们有旧版本的Powershell和可以执行ForEach-Object的Win2k8服务器不能做一个dsquery。

以下是我尝试解析并删除除服务器名称之外的所有dsquery输出的示例。

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

输出应为

SERVER001
SERVER008

有关使用其他方法执行此操作的任何建议,或仅仅是从文件中删除多余文本的小问题。

2 个答案:

答案 0 :(得分:1)

针对你的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

它的作用基本上是使用两个不同的分隔符:“=”和“,”它们立即围绕着你的服务器名称。并且仅查找第二个令牌。它的工作原理基于您在上面提供的字符串。

答案 1 :(得分:0)

PowerShell V1中引入了ForEach-Object cmdlet,因此您可以在那里使用它。

Jon的正则表达式here向您展示了如何从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' 
}