我在这里检查了很多其他问题,但无法找到我需要的东西。我目前正在尝试自动查找哪些虚拟机在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
有关使用其他方法执行此操作的任何建议,或仅仅是从文件中删除多余文本的小问题。
答案 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'
}