在Windows cmd.exe中更改Perl目录

4
根据手册,chdir如果可能的话,将工作目录更改为EXPR 当从cmd.exe执行此脚本时:
my $path = 'C:\\some\\path\\';
print "$path\n";
chdir("$path") or die "fail $!";

这导致产生以下输出结果:
C:\some\path\

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


3
@Sinan:是否真的有必要将我的“谢谢!”编辑掉呢? - dls
3个回答

7
请参阅FAQ

严格来说,这是不可能的 - 脚本作为与启动它的shell不同的进程执行。对进程的更改不会反映在其父进程中,只会反映在在更改后创建的任何子进程中。

相同的答案也适用于Windows。

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

6
当shell运行程序时,它实际上是分叉(fork)然后执行该程序——在这种情况下,是您的perl脚本。该分叉进程中的目录已更改,然后该进程死亡。然后您将返回到原始的shell进程。

是的 - 那很有道理。我能否生成另一个cmd.exe实例并将其启动在适当的目录下? - dls
嗯,在Windows上没有“fork”的概念。只是Perl脚本使用的目录与shell使用的目录不同。 - Joey
1
在Windows上确实有fork()。 Cygwin完全模拟它:https://dev59.com/g3NA5IYBdhLWcg3wYMt- 但是,你会注意到我用了“本质上分叉”的话。它可能在后台某个时候使用CreateProcess(http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx)。 - Conspicuous Compiler
@dls:您可以在Perl脚本中使用system('cmd')执行cmd。这将在所需目录中启动命令shell。当有人键入“exit”退出cmd shell时,对system的调用将返回。 - Conspicuous Compiler
1
这段代码可以实现我想要的功能:system("cmd /K cd /d $final_dest");其中$final_dest是所需路径。谢谢! - dls

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 是一个模块,用于将 DOS 命令写入 $ENV{TMPBAT} 中,如果 1) 它不存在或者 2) 源脚本的时间戳比它更旧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接