2017-03-02 3 views
0

haben in der Lage, die folgenden zusammen, die funktioniert, aber hat eine zusätzliche Zeile am Ende.WMIC bekommen die großen Eltern in Batch

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

Wenn er gestartet wird, sehen wir:

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

und \ ist nicht korrekt.

+0

Ich würde PowerShell lieber als Batch (eine Zeile) empfehlen: 'gwmi Win32_Service -Filter" Name LIKE 'tomcat%' "| % {$ _. Pfadname} ' –

Antwort

1

Verpackung um eine andere for /F Schleife der Unicode-to-ANSI-Text-Konvertierung Artefakte loszuwerden (Wagenrücklaufzeichen verwaisten) nach links durch 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 
    ) 
) 

Die äußere Schleife die Lese- volle Zeilen außer der, die Sie überspringen möchten; der innere analysiert den Text.

+0

Ich mag diese Antwort am besten, da sie alles deckt was benötigt wird und wenn wir Script Golf spielen würden, denke ich, das ist der Gewinner! Ich schätze alle Eingaben für diese Frage. – Leptonator

0

Wenn Sie es in Batch tun möchten, können Sie stattdessen diese Syntax verwenden. Dies gibt Ihnen nur den übergeordneten und den übergeordneten Ordner. Wenn Sie den vollständigen Pfad zu diesen benötigen, fügen Sie die Modifikatoren der Variablen FOR hinzu.

@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% 

Ich wollte nur diesen zusätzlichen Code hinzufügen, um Ihnen zu zeigen, wie Sie die Ordnerpfade in Variablen aufteilen können.

@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

Ich erhalte Folgendes:' Die folgende Verwendung des Pfadoperators in der Batch-Parameter-Ersetzung ist ungültig:% ~ dpG \ .. ' – Leptonator

+0

Entschuldigung. Ich vermisste das%. – Squashman

+0

Nicht ganz .. Ich wurde nur darauf hingewiesen: http://StackOverflow.com/Questions/15685816/How-Cani-Iremove-empty-Lines-from-wmic-output von einem meiner Mitarbeiter .. Posting die Lösung jetzt. – Leptonator

0

Einer meiner Kollegen bei meiner Arbeit wies mich auf:

How can I remove empty lines from wmic output? - genauer gesagt: 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 

Ich weiß, es als @ Squashman-Lösung nicht so elegant ist, aber das ist was ich suche oder zumindest ähnlich.

+0

Also sollte das wirklich als doppelte Frage markiert werden? – Squashman

0

Es ist meine Erfahrung, dass PathName tatsächlich zusätzliche Zeilen zurückgibt. Wenn ich sage, dass ich über die übliche "ungerade" Ausgabe von WMIC-Befehlen hinausgehe. Um sicher zu sein, dass Ihre Ausgabe nicht betroffen ist, würde ich es mit Call lösen.

@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(%* 
Verwandte Themen