2017-03-02 69 views
0

最终能够将以下工作放在一起,但有一个额外的路线。批量取得盛大母公司的WMIC

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
  • \

和\是不正确的。

+0

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

回答

1

围绕另一个for /F环裹摆脱Unicode到ANSI文本转换人为因素(如孤儿回车字符)留下的for /F

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 
    ) 
) 

外环读取除了你想要跳过的行之外的完整行;内部的人解析文本。

+0

我喜欢这个答案最好,因为它涵盖了需要什么,如果我们玩脚本高尔夫,我认为这是赢家!我很欣赏这个问题的所有投入。 – Leptonator

0

如果您想批量执行此操作,则可以使用此语法。这只是给你父母和祖父母文件夹。如果您需要完整的路径,请将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 
+0

我收到以下内容:'批处理参数 替换中的路径运算符的以下用法无效:%〜dpG \ ..' – Leptonator

+0

对不起。我错过了两倍的%。 – Squashman

+0

不完全..我只是指着:http://stackoverflow.com/questions/15685816/how-can-i-remove-empty-lines-from-wmic-output从我的一个同事..发布现在的解决方案。 – Leptonator

0

我的一个在我的同事向我指出:

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的解决方案为优雅,但这种是我正在寻找或至少类似。

+0

所以真的这应该被标记为重复的问题? – Squashman

0

这是我的经验,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(%*