Ich habe mich gerade an einer OTRS-Installation auf meinem Windows-Laptop versucht. Allerdings habe ich nicht den Windows-Installer genommen, sondern direkt die Quellen. Natürlich habe ich einen Pfad mit Leerzeichen genommen und schon ging nix mehr...
Schnell stieß ich auf folgenden Code:
my $Dir = $Self->{ConfigObject}->Get('TemplateDir') . '/HTML/';
if ( -e $Dir ) {
my @Files = glob("$Dir/Layout*.pm");
}
Dazu muss man wissen, dass glob den String an den Leerzeichen "aufteilt", also wird z.B. aus "C:\Program Files" das hier:
glob('C:\Program','Files/Layout*.pm');
glob liefert bei einem String ohne Wildcard einfach diesen String zurück...
Jetzt gibt es zwei mögliche Lösungen:
Erstens die alte 8.3-Schreibweise verwenden, da es dabei keine Leerzeichen gibt. Der Pfad würde dann so aussehen: "C:\PROGRA~1". Die "guten" alten DOS-Zeiten lassen grüßen.
Zweitens: Die Installation einfach in ein Verzeichnis ohne Leerzeichen schieben.
Ich habe mich für zweitens entschieden, weil das jetzt schneller ging, der Windows-Installer nimmt die erste Möglichkeit.
3 comments:
Das ist natürlich sehr doof, dass glob an Leerzeichen aufteilt - zumindest in diesem Fall. Allerdings sollte man ja generell darauf verzichten, Leerzeichen in Pfadnamen zu setzen. Unter Windows ist das natürlich an mehreren Stellen ein Problem...
Tja, ist halt Windows ;-) Aber man denkt im ersten Moment ja auch nix böses, wenn man so Programme installiert. Der Teufel steckt eben im Detail...
glob macht ja das Richtige!
Deshalb verwende ich statt
@list = glob(...);
lieber
use File::Glob ':glob';
@list = bsd_glob(...);
In der Hilfe zu File::Glob heiszt es
Since v5.6.0, Perl's CORE::glob() is implemented in terms of bsd_glob().
Note that they don't share the same prototype--CORE::glob() only accepts
a single argument. Due to historical reasons, CORE::glob() will also
split its argument on whitespace, treating it as multiple patterns,
whereas bsd_glob() considers them as one pattern.
Post a Comment