2011-10-22 92 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; }