2010-03-08 38 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}的模块。