Ich muss eine Batch-Datei erstellen, die 3 Parameter empfängt (nennen wir sie p1, p2 und p3) und sie zeilenweise in eine neue Datei im Benutzer-Desktop-Ordner (diese) schreibt letzter Teil ist wichtig)

Erwartete Nutzung: D:\Temp\WriteFile -p1=aaa -p2=bbb -p3=ccc

Ausgabe in C:\User\Desktop\output.txt (oder wo immer sich der Benutzer-Desktop-Ordner befindet):

aaa
bbb
ccc

Was mich mehr beschäftigt, ist, den aktuellen Benutzer-Desktop-Ordner zu finden und die Datei dort zu schreiben.

-3
odiseo 19 Apr. 2018 im 02:38

4 Antworten

Beste Antwort

Zunächst versuchen Sie, Parameter falsch zu übergeben. Der Windows-Standard für Batchdateien besteht nicht darin, die Parameter zu benennen, sondern sie direkt an die Befehlszeile zu übergeben (Beispiel unten).

Zweitens befindet sich der Desktop-Ordner des Benutzers in %USERPROFILE% im Desktop-Unterordner (wieder Beispiel unten).

Dadurch wird der gewünschte Inhalt in den Desktop-Ordner des aktuellen Benutzers in einer Datei mit dem Namen testdesktop.txt geschrieben. Die erste Zeile erstellt die Datei und schreibt den ersten Parameter, der als erste Zeile übergeben wird. Die anderen Zeilen hängen die aufeinanderfolgenden Parameter an dieselbe Datei an. Die doppelten Anführungszeichen um den Ausgabedateinamen behandeln Benutzernamen mit Leerzeichen (z. B. "John Smith"), wobei der Desktop-Ordner C:\Users\John Smith\Desktop wäre.

Speichern Sie diesen Inhalt in einer Batch-Datei. Nennen wir zu Demo-Zwecken MakeDesktopFile.bat und die von ihm erstellte Datei testdesktop.txt.

@echo off
echo %1 > "%userprofile%\Desktop\testdesktop.txt"
echo %2 >> "%userprofile%\Desktop\testdesktop.txt"
echo %3 >> "%userprofile%\Desktop\testdesktop.txt"

Nennen Sie es so:

MakeDesktopFile aa bb cc

Die Ausgabe:

C:\>type %userprofile%\Desktop\testdesktop.txt
aa
bb
cc

C:\>
2
Ken White 19 Apr. 2018 im 00:03

Der sicherste Weg, um den Speicherort des Desktops zu ermitteln, ist die Registrierung:

@Echo Off
If "%~1"=="" GoTo Next
Set "SF=Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
For /F "EOL=H Tokens=2*" %%A In ('Reg Query "HKCU\%SF%" /V Desktop') Do (
    For %%C In (%*) Do Echo %%~C)>"%%~B\output.txt"
:Next

Sie würden dieses Skript WriteFile.cmd folgendermaßen ausführen:

D:\Temp\WriteFile aaa bbb ccc

Wenn einer der Parameter Leerzeichen oder problematische Zeichen wie , ; = enthält, sollten Sie diese mit doppelten Anführungszeichen umgeben:

D:\Temp\WriteFile "aa a" "b,bb" "cc;c" "d=dd"
2
Compo 19 Apr. 2018 im 01:24
@echo off
setlocal

for %%A in (%*) do call :args %%A

echo p1=%p1% p2=%p2% p3=%p3%

call :shellfolder desktop
if errorlevel 1 exit /b 1

(
    echo Desktop: "%desktop%"
    echo p1: %p1%
    echo p2: %p2%
    echo p3: %p3%
) > "%desktop%\output.txt"

exit /b

:args
set arg=%~1
if "%arg:~,1%" == "-" set "prefix=%arg:~1%" & exit /b
set %prefix%=%arg%
exit /b

:shellfolder
for /f "tokens=1,2*" %%A in (
    'reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "%~1"'
) do if /i "%%~A" == "%~1" set "%~1=%%~C"
exit /b

Der Benutzerdesktop ist ein Shell-Ordner , sodass er möglicherweise nicht im Benutzerprofil enthalten ist Mappe. Einige Registrierungslesungen sind erforderlich, um den Speicherort zu ermitteln.

Eine Beschreibung des obigen Skripts:

Die Skriptargumente werden mit jedem Argument an die 1. for-Schleife übergeben begrenzt durch das Zeichen = sowie das übliche Leerzeichen. Das aufgerufene Label :args weist das an arg übergebene Argument zu. Wenn das erste Zeichen - ist, wird es andernfalls auf prefix gesetzt es wird %prefix%=%arg% gesetzt, wobei %prefix% das Argument ist Präfixname, d. h. p1.

Das aufgerufene Label :shellfolder akzeptiert den Wert des Shell-Ordners als Argument. Ein reg query in der for - Schleife ruft den Datenwert des Shell-Ordners ab und setzt den Argumentnamen auf den Datenwert. Es wird kein explizites errorlevel festgelegt, d. H. exit /b 1 als Fehlerstufe von reg query kann ausreichend sein. Eine Überprüfung von errorlevel wird durchgeführt nach dem Aufruf von :shellfolder, um sicherzustellen, dass das Fortfahren sicher ist.

Wenn dies erfolgreich ist, wird output.txt auf den Desktop des Benutzers geschrieben.

1
michael_heath 19 Apr. 2018 im 01:25

Der wahrscheinlich einfachste Weg ist die Verwendung einer for-Schleife. es ist nicht abhängig von der Anzahl der Argumente, es kann 3 oder 5 sein usw.

@echo off
for %%i in (%*) do (
    echo %%i >> "%USERPROFILE%\Desktop\output.txt"
)

Wenn Sie die Ausgabe jedoch jedes Mal neu schreiben möchten, wenn Sie sie ausführen, leeren Sie einfach die Datei.

@echo off
type > nul "%USERPROFILE%\Desktop\output.txt"
for %%i in (%*) do (
    echo %%i >> "%USERPROFILE%\Desktop\output.txt"
)
0
Gerhard Barnard 19 Apr. 2018 im 06:10