【问题标题】:WMIC getting the grand parent in batchWMIC 批量获取祖父母
【发布时间】:2017-03-02 17:34:50
【问题描述】:

已经能够将以下确实有效的内容放在一起,但最后有一个额外的行。

For /f "tokens=1,2 skip=1 delims=\" %%i IN (
  'WMIC service WHERE "name LIKE 'tomcat%%'" GET PathName'
) DO (
echo %%i\%%j
)
Pause

运行时,我们看到:

  • D:\tomcat
  • D:\tomcat2
  • \

而\是不正确的。

【问题讨论】:

  • 我会推荐 PowerShell 而不是批处理(一行):gwmi Win32_Service -Filter "Name LIKE 'tomcat%'" | % { $_.PathName }

标签: batch-file wmi wmic


【解决方案1】:

环绕另一个 for /F 循环以摆脱 for /F 留下的 Unicode 到 ANSI 文本转换伪影(孤立的回车字符):

for /F "skip=1 delims=" %%a in ('
    wmic Service where "Name LIKE 'tomcat%%'" get PathName
') do (
    for /F "tokens=1,2 delims=\" %%i in ("%%a") do (
        echo %%i\%%j
    )
)

外层循环读取除您要跳过的那一行之外的所有行;内层解析文本。

【讨论】:

  • 我最喜欢这个答案,因为它涵盖了所需的内容,如果我们正在玩脚本高尔夫,我认为这是赢家!感谢您为这个问题提供的所有意见。
【解决方案2】:

我工作的一位同事指出:

How can I remove empty lines from wmic output? - 更具体地说:https://stackoverflow.com/a/15686239/175063

For /f "tokens=1,2 skip=1 delims=\" %%i IN (
  'WMIC service WHERE "name LIKE 'tomcat%%'" GET PathName  ^| findstr /r /v "^$"'
) DO (
echo %%i\%%j
)
Pause

我知道它不像@Squashman 的解决方案那么优雅,但这是我正在寻找的或至少类似于的。

【讨论】:

  • 所以这真的应该被标记为重复问题吗?
【解决方案3】:

我的经验是 PathName 实际上会返回额外的行。当我说我的意思是在 WMIC 命令的通常“奇怪”输出之上。为确保您的输出不受影响,我将使用Call 解决它。

@Echo Off
For /F "Skip=1 Delims=" %%A In (
    '"WMIC Service Where (Name Like 'tomcat%%') Get PathName"'
) Do Call :Sub %%A
Timeout -1
GoTo :EOF

:Sub
If Not "%~1"=="" Echo(%*

【讨论】:

    【解决方案4】:

    如果您想批量执行,可以改用此语法。这只是给你父母和祖父母文件夹。如果您需要这些的完整路径,请将 dp 修饰符添加到 FOR 变量。

    @echo off
    For /f "skip=1 delims=" %%G IN ('WMIC service WHERE "name LIKE 'wdpostman'" GET PathName ^|findstr /r /V "^$"') DO (
        for %%H in ("%%~dpG\.") do set "parent=%%~nxH"
        for %%H in ("%%~dpG\..") do set "gparent=%%~nxH"
    )
    echo parent=%parent%
    echo gparent=%gparent%
    

    只是想添加这组额外的代码来向您展示如何将文件夹路径分解为变量。

    @echo off
    setlocal enabledelayedexpansion
    For /f "skip=1 delims=" %%G IN ('WMIC service WHERE "name LIKE 'wdpostman'" GET PathName ^|findstr /r /V "^$"') DO (
        set "_fpath=%%~dpG"
    )
    set "_fpath=%_fpath:~0,-1%"
    set i=1
    set "_spath!i!=%_fpath:\=" & set /A i+=1 & set "_spath!i!=%"
    echo There %i% Folder(s^)
    set _spath
    
    Pause
    

    【讨论】:

    • 我收到以下信息:The following usage of the path operator in batch-parameter substitution is invalid: %~dpG\..
    • 对不起。我错过了翻倍的百分比。
    • 不完全是……我的一位同事刚刚向我指出:stackoverflow.com/questions/15685816/………现在发布解决方案。
    • @Leptonator,是的,你是对的。我正要添加该代码。我总是忘记 WMIC 输出空行。
    • @Leptonator,我添加了一组额外的代码来向您展示如何将每个文件夹也放入一个变量中。
    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2014-12-14
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    相关资源
    最近更新 更多