【问题标题】:Parsing and removing text with cmd or powershell使用 cmd 或 powershell 解析和删除文本
【发布时间】:2012-03-14 04:33:01
【问题描述】:

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

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

【问题讨论】:

    标签: powershell batch-file cmd batch-processing


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

      ForEach-Object cmdlet 是在 PowerShell V1 中引入的,因此您可以在其中使用它。

      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' 
      }
      

      【讨论】:

      • 这有效,但前提是我将其括在引号中,从而使输出带有引号。我认为它必须这样做,因为我正在从批处理文件 powershell -command "Get-Content dsquery2.txt | % { $_ -replace '(CN=)(.*?),.*', '$2' }" 调用 powershell 命令
      • @Edwin 为什么不直接使用 PowerShell 而不是将两者混合使用?生活会容易得多:-)
      • 老实说,我对 powershell 一无所知。尽我所能,尽我所能,尽我所能,尽我所能。我会尝试在 Powershell 中制作整个东西,因为我似乎无法让它与两者一起使用。
      • @Edwin 我更新了我的答案,向您展示如何将批处理脚本转换为纯 PowerShell 脚本。如果您向我展示原始文本文件的外观并描述您想要的结果,我可以添加一个示例来做到这一点。
      猜你喜欢
      • 2018-08-06
      • 2013-12-17
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      相关资源
      最近更新 更多