2013-07-12 49 views
0

我有一個Perl腳本,我想用system()調用一些shell程序,並可能在後臺處理程序的輸出。shell實用程序在perl系統中不工作()調用

從powershell內部,我可以運行更多,tee,grep和其他東西,而無需指定可執行文件的完整路徑。 我不明白爲什麼以下失敗

C:\Users\xxxwork> perl -W -e "system 'more foo.log | tee bar.txt'" 
'tee' is not recognized as an internal or external command, 
operable program or batch file. 

而下面的作品, C:\用戶\ xxxwork> perl的-W -e 「系統 '更foo.log | grep的-e失敗'」

以發球直接調用工作

C:\Users\xxxwork> tee 
cmdlet Tee-Object at command pipeline position 1 
Supply values for the following parameters: 
FilePath: 

我曾嘗試更換三通通過它從「三通對象」滿,但我得到了相同的結果。是否有任何額外的環境變量需要在這種特定的情況下設置爲讓Perl看到shell所看到的完整的$ Path? 這是因爲在某種情況下,grep是純粹的應用程序,而在另一種情況下,tee是shell實用程序?

PS C:\Users\xxxwork> get-command Tee-Object 

CommandType  Name            ModuleName 
-----------  ----            ---------- 
Cmdlet   Tee-Object           Microsoft.PowerShell.Utility 
PS C:\Users\xxxwork> get-command grep 

CommandType  Name            ModuleName 
-----------  ----            ---------- 
Application  grep.exe 

由於 ģ

+1

什麼是「shell工具」? 'system'運行'cmd.exe',而不是Powershell。 – choroba

+0

@choroba說什麼。此外,你究竟想要達到什麼目的?在PowerShell中的Perl內部運行'more' /'tee'完全沒有意義。 Perl和PowerShell都可以完成幾乎所有你可以用shell命令完成的任務,而且你完全不需要兩者。 –

+0

看來這是真正的問題**系統()**運行** cmd.exe **而不是** Powershell **。有沒有一種簡單的方法來強制** system()**使用** Powershell **?我已經嘗試過'system(「powershell'mycommands'」),但它現在可以工作。 – guytout

回答

1

system有兩個目的。它可以用來啓動一個程序:

system($program, @args_to_program) 

或者,它可以被用來執行shell命令:

system($shell_command) 

後者基本上等同於

system('cmd', '/x', '/c', $shell_command) 

powershell /?,我們看到它可以被指示使用-Command參數執行命令,所以powershell的等效項將是

system('powershell', '-Command', $powershell_command) 
+0

作爲替代設置env變量PERL5SHELL類似於'$ env:PERL5SHELL =「powershell -Command」' (例如,通過在** $ profile **中添加上面的行)也可以完成這項工作。然而,在我的情況下(包括兩種變體),儘管執行策略設置爲** RemoteSigned **,但shell抱怨由於在機器上禁用了腳本執行,所以無法加載** $配置文件。不過,這些命令按預期執行。 – guytout

+0

我不會推薦。我無法真正想到使用PERL5SHELL來指定不同shell的用例。應該使用PERL5SHELL來提供預期的shell(cmd或sh)的路徑,也許可以選擇。 – ikegami

+0

恕我直言,使用PERL5SHELL使腳本更具可移植性,因爲它可以在另一個系統上運行而無需進一步修改。 – guytout