根据手册,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