从 Windows cmd.exe 更改 Perl 目录

发布于 2024-08-24 07:32:48 字数 389 浏览 8 评论 0原文

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

从 cmd.exe 执行此脚本时:

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

会产生以下输出:

C:\some\path\

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

According to the manual, chdir, Changes the working directory to EXPR, if possible.

This script, when executed from cmd.exe:

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

results in this output:

C:\some\path\

but when I am returned to the command prompt - I'm still at the original directory. Am I misunderstanding the purpose of chdir?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

笙痞 2024-08-31 07:32:48

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

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

同样的答案也适用于 Windows。

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

See the FAQ 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?

In the strictest sense, it can't be done—the script executes as a different process from the shell it was started from. Changes to a process are not reflected in its parent—only in any children created after the change.

The same answer applies to Windows as well.

You can modify the starting directory of subsequent cmd.exe invocations, or of child processes by messing with shortcuts and/or the registry.

天赋异禀 2024-08-31 07:32:48

当 shell 运行一个程序时,它本质上是分叉然后执行该程序——在本例中是您的 perl 脚本。该分叉进程中的目录已更改,然后该进程就会终止。然后您将返回到原始 shell 进程。

When a shell runs a program, it essentially forks then execs the program -- in this case, your perl script. The directory within that forked process has been changed, and then that process dies. You're then returned to the original shell process.

野稚 2024-08-31 07:32:48

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

I have changing directories and command environments by using the perl -x switch to execute Perl code in embedded in a file.

@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 is a module that writes DOS commands to $ENV{TMPBAT} if 1) it doesn't exist or 2) is older than the source script.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文