用powershell创建symboliclink

时间:2019-04-23 03:23:17

标签: powershell

我在下面编写脚本来比较和使用powershell创建符号链接。

$Source = "C:\Transcode\Powershell\abc&1"
$Destination = "C:\Transcode\Powershell\abc&2"
$filter = '*.txt'
$tmp = "$Source\tmp.log"
$log =   "$Source\delete.log"

function New-SymLink ($link, $target)
{
    if ($PSVersionTable.PSVersion.Major -ge 5)
    {
        New-Item -Path $link -ItemType SymbolicLink -Value $target
    }
    else
    {
        $command = "cmd /c mklink "
        invoke-expression "$command ""$link"" ""$target"""
    }
}
Get-ChildItem -Path $Source -Filter $filter -Recurse | 
ForEach-Object {
    $name=$_.BaseName
    $ext=$_.Extension
    $fileS=$_.FullName
    $fileD="$Destination\$name$ext"
    IF (Get-Content $tmp | Where-Object{$_ -match "$name"}){
        New-SymLink ("""""$fileD""""","""""$fileS""""")
    }
}

我遇到文件名包含符号&的麻烦。 我可以像这样通过调用命令promt创建链接

cmd /c mklink """$Destination\$name$ext""" """$fileS"""

但是我想使用功能。 你能帮我解决吗

1 个答案:

答案 0 :(得分:0)

尝试此简化版本(仅部分测试)

  • 用尖号&来使$command中的^&逃脱
  • 删除冗余和可能不需要的报价

## Q:\Test\2019\04\23\SO_55803869.ps1
$Source      = "C:\Transcode\Powershell\abc&1"
$Destination = "C:\Transcode\Powershell\abc&2"
$filter      = '*.txt'
$tmp         = Get-Content "$Source\tmp.log"
$log         = "$Source\delete.log"

function New-SymLink ($link, $target){
    if ($PSVersionTable.PSVersion.Major -ge 5){
        New-Item -Path $link -ItemType SymbolicLink -Value $target
    } else {
        $command = 'cmd.exe /c mklink "{0}" "{1}"' -f $link,$target
        invoke-expression $command.Replace('&','^&')
    }
}

Get-ChildItem -Path $Source -Filter $filter -Recurse | ForEach-Object {
    $fileD= Join-Path $Destination $_.Name
    IF ($tmp | Where-Object {$_ -match $_.BaseName} ) {
        New-SymLink $fileD $_.FullName
    }
}