如何使用Perl创建符号链接?

Red*_*Red 4 perl symlink

我试图在Perl中运行以下代码:

symlink($oldname,$newname) or die print "$!\n";
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误说:

The symlink function is unimplemented at C:\...\CreateSymlink.pl line 14.
Run Code Online (Sandbox Code Playgroud)

如果我将代码更改为:

link($oldname,$newname) or die print "$!\n";
Run Code Online (Sandbox Code Playgroud)

然后正在创建没有错误的硬链接.

使用Activestate Perl和Windows 7 32位.

任何想法为什么会这样?我正在尝试为文件创建符号链接.

PS:我是Perl的新手.

小智 9

哪种"种类"的"象征性联系"?;-)

  • 一个捷径.LNK?(Win95的+,透明)
  • 一个交接点?(Win2K +,仅限本地文件系统/目录)
  • 一个真正的NTFS符号链接?(VISTA/2008/Win7的+)

哦,并阅读上面的符号链接维基百科文章的mklink命令;-) Back-ticks(或系统)可以是一个好朋友,但请注意:

Windows Vista/Windows 7中的默认安全设置禁止非提升管理员和所有非管理员创建符号链接.可以[通过安全策略设置]更改此行为....

快乐的编码.


WinAPI CreateSymbolicLink函数可以直接使用; 我不确定它是否"受到"与上述mklink命令相同的限制.但是,此线程表明它仍然有效.


FWIW,这在Strawberry Perl 5.12中"有用".YMMV,我刚打了这个,从来没有用过它:-)

use Win32::API;
$fn = Win32::API->new(
    # Note "A" function, IDK how to use Unicdoe
    "kernel32", "BOOLEAN CreateSymbolicLinkA(LPTSTR lpSymlinkFileName, LPTSTR lpTargetFileName, DWORD flags)"
);

unlink("src.txt");
unlink("lnk.txt");
open(FH,">src.txt") or die $!;
close(FH);

print "src.txt exists? " , (-f "src.txt"), "\n";
print "lnk.txt exists? " , (-f "lnk.txt"), "\n";
$hr = $fn->Call("lnk.txt", "src.txt", 0);
print "Result: ", $hr, "\n";
print "lnk.txt exists? ", (-f "lnk.txt"), "\n";

open(FH,">>src.txt") or die $!;
print FH "hello world!\n";
close(FH);

open(FH,"<lnk.txt") or die $!;
print "linked data: ", scalar(<FH>), "\n";
close(FH);
Run Code Online (Sandbox Code Playgroud)

我的结果(以"管理员"身份运行 - 可能不适用于"其他用户" - 我不知道为什么但我的cmd.exe始终以提升的权限打开):

src.txt exists? 1
lnk.txt exists?
Result:
lnk.txt exists? 1
linked data: hello world!

目录列表:

10/22/2011  02:53 PM    <DIR>          .
10/22/2011  02:53 PM    <DIR>          ..
10/22/2011  02:54 PM               636 foo.pl
10/22/2011  02:53 PM    <SYMLINK>      lnk.txt [src.txt]
10/22/2011  02:53 PM                14 src.txt

我不知道NTFS符号链接和"UNIX"符号链接之间可能有什么[微妙的]差异.此外,上述版本在Vista/2008之前不起作用 - 以前版本的NTFS 支持符号链接(以前版本的Windows没有该CreateSymbolicLink功能).