• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

Frage zu einem Batch-Datei-Problem

Macianer

Active member
Registriert
19 Juni 2008
Beiträge
996
Punkte Reaktionen
0
Moin,

ich habe folgende kleine Batch-Datei geschrieben:

#! /bin/sh
set str=Hallo
echo str

Dieses kleine Programm soll mir den Inhalt der Variable str einlesen (also Hallo) und ihn mir dann auch wieder ausgeben. Leider klappt das nicht. Statt Hallo erscheint str.

Kann mir jemand sagen was ich falsch mache und wo der Fehler liegt?

Maci
 
Das Shebang sieht eher nach Bash-Script aus als nach Batch. Bist Du sicher, dass Du da nichts seltsames kombinierst?
Die Bash-Variante davon wäre
Code:
#!/bin/bash
str="Hallo"
echo $str
Die Batch-Variante müsste eher so aussehen
Code:
@echo off
set str=Hallo
echo %str%
 
Yo sorry, hatte mich da versehen. War natürlich bash nicht batch ^^. Sorry für die Irreführung.

Jetzt habe ich aber ein neues Problem: Ich habe mir ein kleines Programm geschrieben, dass .ps-Dateien in .pdf-Dateien umwandeln soll. Beim Ausführen erscheint aber folgende Fehlermeldung:



Error: /ioerror in --read--
Operand stack:
true --nostringval-- 0 --nostringval--
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1 3 %oparray_pop --nostringval-- 1 1 3 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval--
Dictionary stack:
--dict:1051/1417(ro)(G)-- --dict:0/20(G)-- --dict:68/200(L)--
Current allocation mode is local
Last OS error: 21
ESP Ghostscript 7.07.1: Unrecoverable error, exit code 1


Mein Code dazu sieht folgendermaßen aus:


#! /bin/sh
path1=/Users/davidjacobs/Desktop/PS/
path2=/Users/davidjacobs/Desktop/PDF/
path3=/Users/davidjacobs/Desktop/web
ps2pdf $path1 '*.ps'

Kann mir da jemand sagen, wo der Fehler liegt?
 
Vermutlich kennt ps2pdf keine Wildcards (also kein '*'), außerdem interpretiert er schon $path1 als ps-Datei (und findet keine Datei, daher der Error /ioerror in --read--).

siehe vielleicht hier.

Kannst du nicht deine ps2pdf-Zeile ersetzen durch die folgenden 2 Zeilen (um zu testen, ob er das * doch kann)?

cd $path1
ps2pdf *.ps
 
Ich geh mal davon aus, dass Du alle ps-Dateien in $path1 umwandeln willst.
Code:
#! /bin/sh
path1=/Users/davidjacobs/Desktop/PS/
path2=/Users/davidjacobs/Desktop/PDF/
path3=/Users/davidjacobs/Desktop/web
cd $path1
ps2pdf *.ps
sollte das erledigen. Ist sowieso sinnvoller, zuerst das Working Directory zu ändern, wer weiß, wo ps2pdf die erzeugten Dateien sonst ablegt :D

e: Ich werd alt...
 
Zuletzt bearbeitet:
Ich geh mal davon aus, dass Du alle ps-Dateien in $path1 umwandeln willst.
Code:
#! /bin/sh
path1=/Users/davidjacobs/Desktop/PS/
path2=/Users/davidjacobs/Desktop/PDF/
path3=/Users/davidjacobs/Desktop/web
cd $path1
ps2pdf *.ps
sollte das erledigen. Ist sowieso sinnvoller, zuerst das Working Directory zu ändern, wer weiß, wo ps2pdf die erzeugten Dateien sonst ablegt :D

e: Ich werd alt...

Richtig. Ich möchte alle Dateien in path1 in .pdf's umwandeln und dann gleichzeitig sie noch verschieben nach path2. Dadurch dass ich aus der working directory rausgehe, passiert in meinem Programm erstmal gar nichts. Sprich er wandelt meine .ps-dateien nicht um und hinterlegt sie dann in path2. Hat einer von vielleicht noch eine Idee?

Ansonsten: Danke erstmal für die Tipps :)

€: Wie definiere ich eigentlich ein Array in einer .sh-datei?
€2: Ich hab das Ganze jetzt mal mit einem Array probiert. Jetzt sieht mein Code so aus:


#! /bin/sh
path1=/Users/davidjacobs/Desktop/PS/
path2=/Users/davidjacobs/Desktop/PDF/
path3=/Users/davidjacobs/Desktop/web
array=path1 ls
for i in $array;
do echo $array;
done;

Er soll folgendes machen: Alle .ps-Dateien erstmal nur auflisten. Damit ich sie dann Stück für Stück mit ps2pdf abarbeiten kann. Das klappt aber noch nicht so ganz.
 
Zuletzt bearbeitet:
ps2pdf kann anscheinend nur eine Datei pro Durchgang verarbeiten.

Code:
#! /bin/sh
path1=/Users/davidjacobs/Desktop/PS/
path2=/Users/davidjacobs/Desktop/PDF/
path3=/Users/davidjacobs/Desktop/web
cd $path1
for f in `find . -maxdepth 1  -iname "*.ps"`; do
    ps2pdf $f
done
mv *.pdf $path2

Könnte/sollte klappen, hat aber keine Abfrage, ob ps-Dateien gefunden wurden... egal.

e: find richtig benutzen, yay.
 
Zuletzt bearbeitet:
Code:
#!/bin/bash

# Path Definitions
path1="/Users/davidjacobs/Desktop/PS/"
path2="/Users/davidjacobs/Desktop/PDF/"
path3="/Users/davidjacobs/Desktop/web/"

## functions
# Function to output an error message and terminate
ErrorMessage () {
        echo -e "Error: $1"
        exit 1
}

# Output usage
OutputUsage () {
    echo "`basename $0`"
    echo "Usage: `basename $0` <options>"
    echo "    -l|--list   list all files in $path1"
    echo "    -c|--conv   convert all files in $path1"
    echo "    -h|--help   display this message"
    exit 0
}

# list all files with extension *.ps in $path1
list () {
    find $path1 -type f -iname '*.ps' | \
    while read file; do
        echo "$file"
    done
    exit 0
}

# convert in $path1 and move from $path1 to $path2
conv () {
    find $path1 -type f -iname '*.ps' | \
    while read file; do
        ps2pdf "$file"
    done
    
# -v bei mv weg, wenn du nicht wissen willst, welche Dateien
# alles kopiert werden
    find $path1 -type f -iname '*.pdf' | \
    while read file; do
        mv -v "$file" "$path2"
    done
}

while [[ "$#" -gt "0" ]] ; do
    case "$1" in
        -l|--list)
            # list all files
            list
            exit 0
        ;;
        -c|--convert)
            # convert all *.ps to *.pdf
            conv
            exit 0
        ;;
        -h|--help)
            # Output usage information
            OutputUsage
        ;;
        -*|--*)
            # unknown option found
            ErrorMessage "Unknown option $1"
        ;;
    esac
done

Alles in einem kleinen Script und damit wären auch Spaces in Dateinamen egal
Nebenbei, was sucht das $path3 da drin?

Bash Beginners Guide und vielleicht sogar den Advanced Bash-Scripting Guide vom Linux Documentation Project zu Gemüte führen, erklärt auch die Funktion und den Einsatz von backticks
 
Zuletzt bearbeitet:
Danke Jungs. Mit der Methode von drc klappt es. Deine Methode BoddyHermann scheint irgendwie nicht zu funktionieren. Jedenfalls kopiert er mir keine .ps-Dateien von path1 nach path2 und wandelt sie währenddessen automatisch in .pdf-dateien um.
 
Zurück
Oben