我试图在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
哪种"种类"的"象征性联系"?;-)
哦,并阅读上面的符号链接维基百科文章的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功能).