2016-12-29 10 views
0

Ich versuche gerade, ein Powershell-Skript durch ein cmd-Skript zu ersetzen, da es für das, was versucht wird, besser geeignet ist.CMD-Ausgabe abziehen, um nur die Verzeichnisse anzuzeigen

In Powershell ich dieses Stück Code, mit einer Liste der persönlichen Ordner Verzeichnisse auf dem Computer zurück

$Name = [Environment]::UserName 
get-item HKCU:\software\Microsoft\Office\15.0\Outlook\Search\Catalog - ErrorAction SilentlyContinue | select -expandProperty property | Out-File Z:\global\pst\PowershellOutput\$Name.txt -append 

Das tut, was ich will, und gibt eine Liste von Verzeichnissen, wie so

H:\PST\My Outlook Data File 1.pst 
H:\PST\My Outlook Data File 2.pst 
C:\PST\My Outlook Data File 3.pst 

Allerdings, wenn ich laufe diese Zeilen, die Registrierung zu extrahieren Schlüssel

regedit.exe /e Z:\global\battest\%username%.txt "HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog" 

Ich erhält eine Ausgabe mit vielen unnötigen Daten

Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog] 
"H:\\PST\\My Outlook Data File 1.pst"=hex:0c,01,00,00,00,00,00,00 
"H:\\PST\\My Outlook Data File 2.pst"=hex:f8,00,00,00,00,00,00,00 
"C:\\PST\\My Outlook Data File 3.pst"=hex:ac,02,00,00,00,00,00,00 

Diese Daten können auf ein anderes Programm übergeben werden * so ein Work-around könnte sein, Daten zu verwenden, innerhalb der „“ Marken aber auch die doppelten Schrägstriche aufweist, die die Daten machen unbehaglich weiterzugeben.

Gibt es einen besseren Weg, um diese Werte in CMD zu greifen oder vielleicht einen Parameter, den ich verpasst habe, der nur die Verzeichnisse zeigt?

  • -Sorry für das nicht auch vor aber dieses Programm ist kein Programm, CMD, ist es Visual Basic
+0

Das Problem mit 'sein regedit' ist es Unicode-Textdateien standardmäßig erzeugt, die durch' cmd' zu handhaben ist nicht trivial; Benutzen Sie stattdessen den 'reg query'-Befehl ... – aschipfl

+0

Hallo, darf ich fragen, warum Cmd für das, was hier getan werden soll, besser geeignet ist als Powershell? – sodawillow

+0

@sodawillow Wenn ich cmd anstelle von Powershell verwenden würde, dann müssen keine Gruppenrichtlinienänderungen dafür vorgenommen werden. –

Antwort

0

Während ich nicht Büro testen installiert ist, sollte dies die Arbeit

zu erledigen
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "HKCU=&H80000001" 
    set "subKey=software\Microsoft\Office\15.0\Outlook\Search\Catalog" 

    >> "Z:\global\pst\PowershellOutput\%username%.txt" (
     for /f "tokens=2 delims={" %%a in (' 
      wmic 
       /NameSpace:\\root\default 
       Class StdRegProv 
       Call EnumValues 
        hDefKey^="%HKCU%" 
        sSubKeyName^="%subkey%" 
      2^>nul 
      ^| find "sNames = {" 
     ') do for %%b in (%%a) do (
      for /f delims^=^" %%c in ("%%~b") do echo(%%~fc 
     ) 
    ) 

Es verwendet wmic die Liste der Werte unter dem angegebenen Schlüssel und filtert die Ausgabe nur abrufen der definierte abrufen Linie mit den Namen dieser Werte im Formular sNames = {"v1", "v2", "v3"}.

Die { wird verwendet, um den Anfang der Zeile aus der Liste von Werten (%%a) zu trennen, und diese Liste iteriert (%%b) jeden Wert zu erhalten. Das letzte Element in der Liste enthält eine Endung }, die entfernt werden muss. Dies wird von %%c gehandhabt, wobei die Anführungszeichen im Wert als Trennzeichen verwendet werden.

Die Version könnte gleichwertig vbs

Option Explicit 

Const HKEY_CURRENT_USER = &H80000001 
Const ForAppending = 8 

Const SUB_KEY = "software\Microsoft\Office\15.0\Outlook\Search\Catalog" 
Const OUTPUT_PATH = "Z:\global\pst\PowershellOutput" 

Dim fso, shell 
    Set fso = WScript.CreateObject("Scripting.FileSystemObject") 
    Set shell = WScript.CreateObject("WScript.Shell") 

Dim values 
    Call GetObject(_ 
     "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv" _ 
    ).EnumValues(_ 
     HKEY_CURRENT_USER, SUB_KEY, values _ 
    ) 

Dim outputFile 
    Set outputFile = fso.OpenTextFile(_ 
     fso.BuildPath(_ 
      OUTPUT_PATH, shell.ExpandEnvironmentStrings("%username%") & ".txt" _ 
     ) _ 
     , ForAppending _ 
     , True _ 
    ) 

Dim value  
    If Not IsNull(values) Then 
     For Each value In values 
      Call outputFile.WriteLine(fso.GetAbsolutePathName(value)) 
     Next 
    End If 

    Call outputFile.Close() 
+0

Vielen Dank für diesen Code, ich verstehe es nicht vollständig, aber ich verstehe genug, um die Ausgabe in eine Textdatei zu bekommen. Es zeigt immer noch das '\' in den Verzeichnissen an, aber das ist ein Ergebnis, mit dem ich leben kann. –

+0

Ich möchte nur hinzufügen und sagen, dass, um die Ausgabe in eine Textdatei zu erhalten, alles was benötigt wird ist ein '>> -InsertDirectory' am Ende dieser Zeile 'für/f delims^= ^" %% c in ("%% ~ b") echo (%% c' –

+0

@ J.Hodge, Antwort aktualisiert, um die Umleitung zu Ausgabedatei, Doppelstrich Entfernung und VBS-Version zu enthalten. –

0

Sie würden wahrscheinlich die REG QUERY Befehl verwenden müssen. In einer einzigen bat-Datei möchte es wie:

@echo OFF 
for /f "usebackq tokens=1-3" %%A in (`REG QUERY "HKCU\Software\Microsoft\Office\15.0\Outlook\Search\Catalog"`) do (
set ValueName=%%A 
) 
echo %ValueName% > Z:\global\battest\%username%.txt 

habe diese von How can I get the value of a registry key from within a batch script?

+0

Okay, ich habe versucht, deinen Code auszuführen, und er hat mir nur ein Ergebnis geliefert? –

+0

Sorry, ich wusste nicht, dass Enter einen Kommentar senden würde. Mit ein wenig Suche habe ich diese REG QUERY HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 15.0 \ Outlook \ Search \ Catalog/s | findstr/L ". pst"> "Z: \ global \ battest \% username% .txt" 'aber ich kann das nicht zum laufen bringen, da es mir ein 'ungültiges Verzeichnis' gibt. Ich bin mir nicht sicher, warum dein Code (den ich nicht vollständig verstehe) mir nur das eine Ergebnis gibt. –

0

Hier ist ein Batch-Code ist die Liste der * .pst Dateien (keine Verzeichnisse), die unabhängig arbeiten an Zahl zu erhalten von * .pst-Dateien und deren Dateinamen, solange die Dateinamen mit .pst enden.

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
for /F "skip=1 delims=" %%# in ('%SystemRoot%\System32\reg.exe query HKCU\Software\Microsoft\Office\15.0\Outlook\Search\Catalog 2^>nul') do (
    set "RegData=%%#" 
    set "DelData=!RegData:*.pst=!" 
    if not "!DelData!" == "!RegData!" call :OutputFileName 
) 
endlocal 
goto :EOF 

:OutputFileName 
set "RegData=!RegData:%DelData%=!" 
echo !RegData:~4! 
goto :EOF 

* .pst-Dateien sind Outlook Personal Storage-Dateien, die Container-Dateien für E-Mails, Kontakte, ...

Der Befehl FÜR läuft Konsolenanwendung REG alle Werte der Registrierungsschlüssel abzufragen :

HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog 

die Ausgabe auf Windows Vista und höher Windows-Versionen für das Beispiel ist:

012.351.
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog 
    H:\PST\My Outlook Data File 1.pst REG_SZ whatever the 
    H:\PST\My Outlook Data File 2.pst REG_SZ data value is 
    C:\PST\My Outlook Data File 3.pst REG_SZ of each value 

Es gibt die Registrierungsschlüssel und als nächstes die Registry-Werte jeweils eingerückt mit 4 Leerzeichen und mit 4 Leerzeichen zwischen Wertname und Werttyp und 4 Leerzeichen zwischen Werttyp und Datenwert.

Aber unter Windows XP die Ausgabe für das Beispiel ist:

! REG.EXE VERSION 3.0 

HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\Catalog 
    H:\PST\My Outlook Data File 1.pst REG_SZ whatever the 
    H:\PST\My Outlook Data File 2.pst REG_SZ data value is 
    C:\PST\My Outlook Data File 3.pst REG_SZ of each value 

So gibt es erste zwei Kopfzeilen vor dem Registrierungsschlüssel. Die Registrierungswerte sind ebenfalls mit 4 Leerzeichen eingerückt.Aber es gibt 1 oder mehr Registerkarten anstelle von Leerzeichen zwischen dem Wertnamen und dem Werttyp, und es gibt auch 1 oder mehr Registerkarten anstelle von Leerzeichen zwischen Werttyp und Datenwert.

Hinweis: Ich weiß nicht, ob REG_SZ der richtige Registrierungswerttyp ist. Ich habe diesen Registrierungsschlüssel überhaupt nicht in meiner Windows-Registrierung und fügte daher nur die 3 Registrierungswerte als Zeichenfolge-Werte mit den Dummy-Zeichenfolgen hinzu.

Also der schwierige Teil ist, wie Sie den Namen des Registrierungswerts erhalten, der auch Leerzeichen enthält, um nur den Namen der * .pst-Dateien unabhängig vom Dateinamen zu erhalten.

Dies wird durch die Zuordnung jeder Ausgangsleitung mit Ausnahme der ersten Zeile wegen skip=1 auf Umgebungsvariable RegData und erhalten neben dieser Linie alles nach .pst auf Umgebungsvariable DelData zugewiesen getan.

Wenn die Leitung .pst auf jedem Fall enthält überhaupt was Wert nicht gleich DelData Wert von RegData ist, das Unterprogramm OutputFileName wird zur Weiterverarbeitung und das Drucken des Dateinamen der Datei Pst * genannt.

In der Subroutine OutputFileName wird zuerst die Zeichenfolge rechts von * .pst Dateiname von RegData mit einer Zeichenfolge ersetzt. Der Name der nächsten * .pst-Datei wird ohne die vier Leerzeichen am Anfang ausgegeben.

Wenn die Anzahl der Einzug Leerzeichen nicht immer genau 4 Leerzeichen wäre, könnte die Zeile echo !RegData:~4! durch folgenden Code ersetzt werden, um unabhängig von der Anzahl der Einzug Leerzeichen/Tabs zu arbeiten.

for /F "tokens=1*" %%I in ("%RegData%") do (
    if "%%J" == "" (
     echo %%I 
    ) else (
     echo %%I %%J 
    ) 
) 

Die Verwendung von REG statt REGEDIT hat den Vorteil, dass keine erhöhte Privilegien eines Administrators für die Ausführung dieser Batch Code erforderlich ist.

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • call /?
  • echo /?
  • for /?
  • goto /?
  • reg /?
  • reg query /?
  • set /?
  • setlocal /?

Wenn der Registrierungsschlüssel nicht vorhanden ist, wird nichts ausgegeben. Die Fehlermeldung zur Ausgabe der STDERR wird hier unterdrückt, indem sie mit 2^>nul an Gerät NUL umgeleitet wird. Details finden Sie im Microsoft-Artikel Using command redirection operators.Der Umleitungsoperator > muss ^ mit Caretzeichen entkam hier wird als Literalzeichen interpretiert wird auf die FOR Befehlszeilen Parsen und als Umleitungsoperator durch FüR auf der Ausführung der REG Befehlszeilen interpretiert.

+0

Vielen Dank für die ausführliche Antwort, aber ich denke, das ist nicht, was ich wollte, ich war nicht in der Lage, die Ausgabe zu bekommen, die ich wollte, aber ich konnte aus dem, was Sie geschrieben haben, lernen. –

Verwandte Themen