我在下面编写脚本来比较和使用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"""
但是我想使用功能。 你能帮我解决吗
答案 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
}
}