2010-03-08 60 views
4

根據手冊,chdir,如果可能,請將工作目錄更改爲EXPR從Windows cmd.exe更改Perl目錄

這個腳本,從CMD.EXE執行時:

my $path = 'C:\\some\\path\\'; 
print "$path\n"; 
chdir("$path") or die "fail $!"; 

結果輸出:

C:\some\path\ 

,但是當我回到命令提示符 - 我仍然在原始目錄。我誤解了chdir的目的嗎?

+3

@Sinan:真的有必要編輯我的「謝謝!」 :) – dls

回答

6

當一個shell運行一個程序時,它基本上分叉,然後執行程序 - 在這種情況下,你的perl腳本。該分叉進程中的目錄已更改,然後該進程死亡。然後您將返回到原始的shell進程。

+0

是 - 這是有道理的。我可以在適當的目錄下產生另一個cmd.exe實例嗎? – dls

+0

呃,在Windows上沒有'fork'這樣的東西。只是Perl腳本使用的目錄不是shell使用的目錄。 – Joey

+1

確定Windows上有fork()。 Cygin完全模擬它:http://stackoverflow.com/questions/985281/what-is-the-closest-thing-windows-has-to-fork但是,你會注意到我用了「基本上叉」這個詞。它可能在某些時候在後端使用CreateProcess(http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx)。 –

7

參見常見問題解答I {changed directory, modified my environment} in a perl script. How come the change disappeared when I exited the script? How do I get my changes to be visible?

在嚴格的意義上說,它不能做—腳本執行從它開始從外殼一個不同的過程。只有在更改後創建的任何子級中,對其過程的更改纔會反映在其父級—中。

同樣的答案也適用於Windows。

您可以修改後續cmd.exe調用或子進程的起始目錄,方法是混入快捷方式和/或註冊表。

1

我使用perl -x開關在嵌入文件中執行Perl代碼來更改目錄和命令環境。

@rem = '--*-Perl-*--' 
@echo off 
set TMPBAT=%TMP%\%0_temp.bat 
perl -x -S %0 %* 
if %errorlevel% == 2000 goto cleanup 
goto endofperl 
#!perl 
#line 9 

use strict; 
use warnings; 
use BatchTool; 


__END__ 
:endofperl 
if exist %TMPBAT% call %TMPBAT% 
:cleanup 
set TMPBAT= 

BatchTool是寫入如果1)不存在或2)比源腳本早期的DOS命令$ENV{TMPBAT}的模塊。