【问题标题】:Perl directory change from Windows cmd.exe从 Windows cmd.exe 更改 Perl 目录
【发布时间】:2010-03-08 22:23:51
【问题描述】:

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

这个脚本,当从 cmd.exe 执行时:

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

结果如下:

C:\some\path\

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

【问题讨论】:

  • @Sinan:真的有必要删掉我的“谢谢!” :)

标签: perl cmd chdir


【解决方案1】:

查看常见问题解答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?

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

同样的答案也适用于 Windows。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的 - 这是有道理的。我可以在适当的目录中生成另一个 cmd.exe 实例吗?
    • 呃,在 Windows 上没有 fork 这样的东西。只是 Perl 脚本使用的目录不是 shell 使用的目录。
    • 当然有 fork() 在 Windows 上。 Cygin 完全模仿它:stackoverflow.com/questions/985281/… 但是,你会注意到我使用了“本质上是分叉”这个词。它可能在某个时候在后端使用 CreateProcess (msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx)。
    • @dls:你总是可以使用 system('cmd') 从你的 perl 脚本中执行 cmd,这将在所需目录中启动一个命令 shell。当有人键入“exit”退出 cmd shell 时,系统调用将返回。
    • 这完成了我所追求的:system("cmd /K cd /d $final_dest");其中 $final_dest 是所需的路径.. 谢谢!
    【解决方案3】:

    我通过使用 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) 比源脚本旧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2023-03-16
      • 2021-05-15
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多