2

我有以下脚本,到目前为止,它可以很好地满足我们的需要,但是由于文件名已更改,因此遇到了错误。

使用以下脚本,由于文件名已更改,它会提供无法找到路径错误。我在哪里错了这个?

## Add ShareFile PowerShell Snap-in
Add-PSSnapin ShareFile

## Create new authentiation file
#New-SfClient -Name "C:\Sharefile\SVCACC.sfps" -Account midl

## Variables ##
$OutputAppReqFID = "fo4a3b58-bdd6-44c8-ba11-763e211c183f"
$Project = 'M000'
$LocalPath = "\\file.server.au\$project\DATA\DATA CUSTODIAN\OUTPUT\"
$sfClient = Get-SfClient -Name C:\sharefile\SVCACC.sfps
$OutputAppReqFID_URL = (Send-SfRequest $sfClient -Entity Items -id $OutputAppReqFID).Url


## Create PS Drive ##
New-PSDrive -Name "sfDrive-$($project)" -PSProvider ShareFile -Client $sfClient -Root "\" -RootUri $OutputAppReqFID_URL

## Copy all files from folders to ShareFile
foreach ($file in Get-ChildItem -Path $LocalPath -Recurse -Force | Where-Object {$_.Mode -ne "d-----"} | Select FullName -ExpandProperty FullName) { 
     Get-ChildItem $file  -Recurse | Rename-Item -NewName { $_.Directory.Name+'_'+$_.Name}
     Copy-SfItem -Path $file -Destination "sfDrive-$($project):" 
    #remove-item $file
    }

<## Remove all folders from UNC directory
foreach ($folder in Get-childitem -Path $LocalPath -Recurse | Where-Object {$_.Mode -eq "d-----"} | Select-Object -ExpandProperty FullName) {
    remove-item $folder
    }
    #>

## Remove PS Drive ##
Remove-PSDrive "sfdrive-$($project)"

收到的错误如下:

Copy-SfItem : Cannot find path '\\file.server.au\M000\DATA\DATA CUSTODIAN\OUTPUT\New Text Document.txt' because it does not exist.
At line:43 char:6
+      Copy-SfItem -Path $file -Destination "sfDrive-$($project):"
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (\\file.serve...xt Document.txt:String) [Copy-SfItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,ShareFile.Api.Powershell.CopySfItem
4

1 回答 1

1

问题是您正在重命名 $file 然后尝试 Copy-SfItem -Path $file 在下一行。这个对 $file 的引用仍然指向重命名之前的旧名称。您需要捕获新重命名的文件路径的路径,然后在 Copy-SfItem 命令中引用它

foreach ($file in Get-ChildItem -Path $LocalPath -Recurse -Force | 
        Where-Object { $_.Mode -ne 'd-----' } | 
            Select-Object -ExpandProperty FullName) {
                
    # capture reference to the new file name by using -PassThru switch with 
    # the Rename-Item cmdlet and saving in a variable ($renamedFile) 
    $renamedFile = Get-ChildItem $file -Recurse | 
        Rename-Item -NewName { $_.Directory.Name + '_' + $_.Name } -PassThru

    # Now we copy using our $newFile reference
    Copy-SfItem -Path $renamedFile -Destination "sfDrive-$($project):" 

    # followed by removing the file if needed
    # remove-item $renamedFile
}

这也可以清理一些。

  • 添加-File开关Get-ChildItem将只为我们提供不需要的文件| Where-Object {$_.Mode -ne "d-----"}
  • | Select-Object -ExpandProperty FullName末尾foreach删除将消除Get-ChildItem在第一个 foreach 循环中再次调用的需要。
foreach ($file in Get-ChildItem -Path $LocalPath -Recurse -Force -File ) {

    # capture reference to the new file name by using -PassThru switch with 
    # the Rename-Item cmdlet and saving in a variable ($newFile) 
    $renamedFile = $file | Rename-Item -NewName { $_.Directory.Name + '_' + $_.Name } -PassThru

    # Now we copy using our $newFile reference
    Copy-SfItem -Path $renamedFile -Destination "sfDrive-$($project):" 

    # followed by removing the file if needed
    # remove-item $renamedFile
}

根据您的评论更新

foreach ($file in Get-ChildItem -Path $LocalPath -Recurse -Force -File ) {

    $file = if ($file.Directory.FullName -ne $LocalPath) {
        # capture reference to the new file name by using -PassThru switch with 
        # the Rename-Item cmdlet and saving in a variable ($file) 
        $file | Rename-Item -NewName { $_.Directory.Name + '_' + $_.Name } -PassThru
    }
    else {
        #Pass thru $file with no changes
        $file
    }

    # Now we copy using our $file reference
    Copy-SfItem -Path $file -Destination "sfDrive-$($project):" 

    # followed by removing the file if needed
    # remove-item $file
}
于 2021-09-28T03:14:36.790 回答