2011-01-05 5 views
2

Ich schrieb ein Perl-Skript, das einige Linux-Befehle verwendet (grep, ls etc ..). Ich kann dies erfolgreich von Cygwin oder Linux ausführen. Ich möchte, dass diese Aufgabe regelmäßig auf einem Windows Server ausgeführt wird, auf dem Cygwin installiert ist. Ich hatte vor, Windows Taskplaner zu verwenden. Aber ich bin mir nicht sicher, wie ich in einer Windows-Datei angeben soll, dass mein Perl-Skript im Cygwin-Modus aufgerufen werden muss?Wie in einer Bat-Datei angeben, dass ein Skript im Cygwin-Modus aufgerufen werden muss?

EDIT: Ich habe den Befehl von Glenn versucht. Als ich versucht habe, das Perl-Skript auszuführen, scheint es nicht zu reagieren. Also habe ich versucht, mit einem Beispielskript: test.sh, die die folgenden zwei Zeilen hat:

ls -l 
cd .. 

Hier ist die Bildschirmaufnahme von dem, was ich erhalte:

alt text

Antwort

4

Ich bin kein großer Fan von Cygwin und persönlich bevorzugen nativ kompilierte Versionen der GNU-Tools, z. GnuWin32.

Ich frage mich auch, warum Sie grep, ls usw. von einem Perl-Skript verwenden würden. Der Großteil dieser Funktionalität kann nativ von Perl gehandhabt werden und führt normalerweise zu einer viel besseren Portabilität und Robustheit.

+0

+1 für die Empfehlung, Shell-Tools von Perl aus aufzurufen. –

+0

@ downvoter würde gerne Ihren Einblick bieten, ich bevorzuge immer einen Kommentar mit einer Down-Abstimmung, da das für jeden von Vorteil ist, der dies liest –

+0

@David Ich begann gerade mit Perl und nicht bewusst API. Ich habe gerade versucht, ein ähnliches Unix-Skript nach Windows zu portieren. Ich werde mir die API natürlich ansehen. – rkg

3

Vielleicht (ungetestet): c:\cygwin\bash.exe -c /path/to/your/script.pl

UPDATE:

Die letzte Fehlermeldung zeigt ein Problem: Ihr Skript ist ein D OS-Formatdatei (CRLF-Zeilenendungen), während cygwin nach dem UNIX-Format (LF-Zeilenendungen) sucht. Der Streuwagen kehrt am Ende jeder Zeile zurück, ist das Problem. Beispielsweise gibt es kein Verzeichnis mit dem Namen ".. \ r"

Verwenden Sie einen Texteditor, in dem Sie die zu verwendenden Zeilenenden angeben können. In einer Bash-Shell können Sie dos2unix test.sh

Fehler ls Fehler gibt an, dass/bin und/usr/bin sind nicht in Ihrer Bash-Umgebung $ PATH - ist das wahr?

+1

oder 'C: \ cygwin \ bin \ bash.exe -c/usr/bin/perl/Pfad/zu/script.pl' sind – mob

+0

@mob, netter Anruf. –

+0

Aktualisiert die Frage. Kannst du bitte einen Blick darauf werfen? – rkg

1

Fügen Sie Ihrem Pfad cygwin hinzu, bevor Sie Perl ausführen. Zum Beispiel laufe ich oft find in einer DOS-Shell, aber bekomme die ziemlich schreckliche Nachricht FIND: Parameterformat nicht korrekt. Bah! Stattdessen habe ich find über ein dos ausführen cmd cyg.cmd Datei:

c:> find . -iname interesting.txt 
FIND: Parameter format not correct 
c:> cyg find . -iname interesting.txt 
sub/sub/interesting.TXT 
c:> type bin\cyg.cmd 
setlocal 
PATH=c:\Progs\Cygwin\bin;%PATH% 
%1 %2 %3 %4 %5 %6 %7 %8 %9 
endlocal 

Das wichtige Bit hier die PATH=c:\Progs\Cygwin\bin;%PATH% ist.

BTW, ich bevorzuge die Cygwin-Versionen der Tools lieber als ihre MinGW-Entsprechungen — die Umgebung ist viel näher an Mac/Linux, und Portabilität ist schließlich wichtig.

1

Sie führen Cygwin Bash, aber Sie müssen immer noch Ihre PATH einrichten. Es sei denn, Sie haben es in Ihrem Profil festgelegt, aber initialisieren Sie das Profil dann mit bash -i.

  1. entweder den vollständigen Pfad angeben Befehle Cygwin benötigt, wie /bin/ls, /bin/grep,
  2. oder fügen Sie c:\cygwin\bin und vielleicht andere Wege zu Ihrem PATH vorher.

2. bevorzugt. Wie

schedule.bat: 
PATH=C:\cygwin\bin;%PATH% 
sh -c ./schedule.sh 

schedule.sh: 
#!/bin/sh 
ls ... 
grep ... 
perl ... 

schedule.sh wird die Umwelt mit dem Pfad von dem übergeordneten Prozess sh.exe, welches ihn von der Fledermaus erbt. Trennen von Shell-Skripten von Batch-Dateien nur zum einfacheren Testen. Sie können die meisten Cygwin-Programme auch von cmd.exe aufrufen.

Sie können /usr/bin in Ihrem DOS PATH nicht festlegen, DOS wird kein c:/usr Verzeichnis haben. Und es funktioniert nur, wenn Sie in C: