4

根据手册,chdir如果可能,将工作目录更改为。EXPR

从 cmd.exe 执行此脚本时:

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

导致此输出:

C:\some\path\

但是当我返回命令提示符时 - 我仍然在原始目录中。我误解了 chdir 的目的吗?

4

3 回答 3

7

请参阅我在 perl 脚本中{更改目录,修改我的环境}的常见问题解答。当我退出脚本时,更改为什么消失了?如何让我的更改可见?

从最严格的意义上说,它是无法完成的——脚本作为与其启动时所在的 shell 不同的进程执行。对流程的更改不会反映在其父进程中 - 只会反映在更改后创建的任何子进程中。

同样的答案也适用于 Windows。

cmd.exe您可以通过弄乱快捷方式和/或注册表来修改后续调用或子进程的起始目录。

于 2010-03-08T22:55:47.397 回答
6

当一个 shell 运行一个程序时,它本质上是 fork 然后执行该程序——在这种情况下,就是你的 perl 脚本。该分叉进程中的目录已更改,然后该进程终止。然后您将返回到原来的 shell 进程。

于 2010-03-08T22:25:48.360 回答
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$ENV{TMPBAT}是一个模块,如果 1) 它不存在或 2) 比源脚本旧,它会写入 DOS 命令。

于 2010-03-09T05:55:41.267 回答