根據手冊,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的目的嗎?
根據手冊,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的目的嗎?
當一個shell運行一個程序時,它基本上分叉,然後執行程序 - 在這種情況下,你的perl腳本。該分叉進程中的目錄已更改,然後該進程死亡。然後您將返回到原始的shell進程。
是 - 這是有道理的。我可以在適當的目錄下產生另一個cmd.exe實例嗎? – dls
呃,在Windows上沒有'fork'這樣的東西。只是Perl腳本使用的目錄不是shell使用的目錄。 – Joey
確定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)。 –
在嚴格的意義上說,它不能做—腳本執行從它開始從外殼一個不同的過程。只有在更改後創建的任何子級中,對其過程的更改纔會反映在其父級—中。
同樣的答案也適用於Windows。
您可以修改後續cmd.exe
調用或子進程的起始目錄,方法是混入快捷方式和/或註冊表。
我使用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}
的模塊。
@Sinan:真的有必要編輯我的「謝謝!」 :) – dls