2009-08-17 80 views
2

我有一個Perl腳本,它的最後一步是創建它創建的文件的壓縮版本。由於一些不幸的設置,我們不能保證給定的客戶將具有特定的壓縮功能。我希望把這樣的事情一起:只有存在外部應用程序的最佳方式

if ($has_jar) { 
    system("jar -c $compressed_file $infile"); 
} 
elsif ($has_zip) { 
    system("zip -j $compressed_file $infile"); 
} 
else { 
    copy($infile, $compressed_file); 
} 

在哪裏,如果他們沒有任何壓縮的應用程序,它只是將文件複製到壓縮文件的位置,而不將其壓縮。

我這裏的粘滯檢票口是我不太確定最好的方法是確定他們是否有jar或zip。它看起來像我可以使用exec()而不是系統()並利用它只會返回,如果它失敗的事實,但腳本實際上確實做了幾件事情之後,所以不會工作。

我還需要這個可移植的解決方案,因爲這個腳本可以在Windows和各種Unix發行版上運行。提前致謝。

+1

它會在早於5.10.0的perls上運行嗎? – 2009-08-17 22:46:04

+0

是的。試了兩臺不同的機器,得到了5.8.4和5.8.0。 – Morinar 2009-08-18 14:55:22

回答

2

查看我的multi-which

+0

哦,我喜歡那樣。相對簡單,易於集成到我現有的腳本中。除非有些瘋狂,否則我很可能會使用它。 – Morinar 2009-08-17 16:27:14

+0

剛剛實現這一點,一切工作正確,因爲我希望它......我知道這是一個類似的答案保羅內森的,但思南提供了一個很好的一段代碼工作。 感謝所有的解決方案,遠遠超出了我的預期。 – Morinar 2009-08-17 16:49:32

+0

@Morinar謝謝。 – 2009-08-17 16:50:57

1

查看PATH環境變量指定的目錄。

+0

是的,那會有用,儘管我肯定希望有更多的「光鮮」。 – Morinar 2009-08-17 15:45:48

+0

沒有更多的光滑。要麼嘗試運行可執行文件,並報告失敗或查看路徑中是否存在合適的可執行文件,請嘗試運行它**和**報告任何失敗。 – 2009-08-17 16:22:39

2

對於基於* nix系統,這應該工作:

my $has_jar = `which jar` ne ''; 

這可能爲Windows工作,以及如果包括which

或者,你可以嘗試通過this answer建議的命令,

my $has_jar = `for %i in (jar.exe) do @echo. %~$PATH:i` ne ''; 

它很可能不會返回「」如果它沒有找到它,但是,但是我沒有Perl的可在一臺Windows機器來測試它。

+0

這肯定會在* nix系統上工作,但我真的沒有能力在Windows上安裝它。如果真的那麼簡單,我只需將zip與應用程序捆綁在一起,而不是首先解決這個問題。 – Morinar 2009-08-17 15:47:06

+0

在這種情況下,我添加了另一個潛在但未經測試的解決方案。 – 2009-08-17 15:59:07

1

通常情況下,類似的東西不會突然從系統中消失,所以我建議在安裝/安裝過程中檢查工具的存在並保存在配置中使用的工具。

+0

好主意,但由於我們爲客戶打補丁的方式以及設置方式,這不是一個真正的選擇。 – Morinar 2009-08-17 15:48:44

1

只要嘗試運行該程序,如何?如果它不能運行,那麼你知道有一個問題。

1

爲什麼不使用Archive::Zip package來進行壓縮,完全不需要外部程序?

+1

這不是我們要求我們的客戶擁有並且試圖在所有機器上獲得它的包,這是一個徒勞的教訓。相信我,這幾乎是我唯一的選擇,我需要找到一種方法讓它工作。 – Morinar 2009-08-17 15:50:02

+0

如果你已經要求他們有非默認包,那麼需要這個包有什麼問題? – 2009-08-17 21:11:53

4

我認爲你最好的選擇是File::Which

+0

同樣不是一個壞主意,雖然我們的客戶再次沒有安裝該軟件包,並且將它們全部投入使用並不是一項簡單的任務。 – Morinar 2009-08-17 15:55:08

+6

然後,你可能會簡單地「竊取」代碼。 – innaM 2009-08-17 16:11:05

+1

Morinar:你可以捆綁它 – 2009-08-17 22:46:52

1

有一對夫婦的事情要考慮,如果你要做到這一點:以列表形式

  • 使用系統和exec所以shell不會得到一個機會來解釋特殊字符。

  • 你可以存儲這個配置,而不是把它放在代碼中嗎?例如,看看CPAN.pm如何做。

  • 你怎麼知道你正在運行你認爲你正在運行的東西?如果有人制造一個同名的特洛伊木馬,你的程序是否會愉快地執行它?請注意,使用PATH,正如Sinan的multi-which所指出的那樣,仍然存在這個問題,因爲它依賴於用戶設置PATH。

+0

這絕對是一個很好的建議。我改變了我的呼叫系統使用列表形式,因爲我獨立發現了同樣的事情。我真的不能在任何配置中存儲它,因爲我們沒有適當的機制,不,沒有辦法知道我在運行什麼。儘管我同意這可能是一個問題,但是我們的應用程序運行的環境通常是非常有控制和衛生的,因此在這裏沒有特別關注木馬或類似的東西。 – Morinar 2009-08-18 14:58:28

相關問題