2011-10-22 94 views
4

我试图运行在Perl下面的代码:如何使用Perl创建符号链接?

symlink($oldname,$newname) or die print "$!\n"; 

,但我得到一个错误说:

The symlink function is unimplemented at C:\...\CreateSymlink.pl line 14. 

如果我的代码更改为:

link($oldname,$newname) or die print "$!\n"; 

那么难链接正在创建,没有错误。

使用activestate Perl和Windows 7 32位。

任何想法为什么会发生这种情况?我正在尝试为文件创建符号链接。

P.S:我是Perl的总新手。

+3

谷歌搜索'窗口符号链接perl'返回很多很多的这方面的信息。简而言之,就是没有像windows中* nix那样的“符号链接”。 perl文档告诉你,如果底层操作系统不支持符号链接,'symlink'将失败。 –

+1

@Brian Roach当然,在过去的5年中发布的windows版本中......-) – 2011-10-22 21:14:00

+0

@pst - 注意“就像在* nix中”一样。他们...不一样。你会认为activestate会做一些事情而不是失败,但他们不会。 –

回答

9

哪种“符号链接”? ;-)

哦,并读取符号链接维基百科的文章上面的mklink命令;-) Back-ticks (or system)可以是一个很好的朋友,但要注意:

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

快乐编码。


WinAPI CreateSymbolicLink函数可以直接使用;我不确定它是否“受到”与上面的mklink命令相同的限制。但是,this thread表示它仍然有效。


FWIW,这个“工程”在草莓Perl 5.12中。因人而异,我刚才输入这件事,从来没有使用过它,否则:-)

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); 

我的结果(RAN为“管理员” - 可能不适用于“其他用户”工作 - 我不知道为什么,但我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”符号链接之间。此外,上述将无法​​工作 pre-Vista/2008 - 以前版本的NTFS 不支持符号链接(并且以前版本的Windows没有CreateSymbolicLink函数)

+0

类型:NTFS符号链接。我以管理员身份登录,cmd提示符在其标题中说管理员。如何在Perl脚本中运行mklink? – Red

+0

你的代码工作正常。但是,当我尝试在我的内部集成,然后没有任何反应。 'code'使用Win32 :: API; $ fn = Win32 :: API-> new( #注意“A”函数,IDK如何使用Unicdoe “kernel32”,“BOOLEAN CreateSymbolicLinkA(LPTSTR lpSymlinkFileName,LPTSTR lpTargetFileName,DWORD flags)” ); $ hr = $ fn-> Call($ oldname,$ newname,0); 'code' – Red

+0

@Red“没有任何反应”或...? – 2011-10-23 02:53:02

1

做了一个解决办法:

my $oldfilename = File::Spec->catfile($oldname); 
my $newfilename = File::Spec->catfile($newname); 
if(-f $newfilename){ } else { 
    @args = ("mklink", $newfilename, $oldfilename); 
    system(@args) == 0; }