Powershell - 重命名文件并上传

Powershell - Rename File and Upload

我有下面的脚本,到目前为止,它可以很好地满足我们的需要,但是 运行 由于文件名已更改而出错。

由于文件名已更改,下面的脚本会提供“找不到路径”错误。 我哪里出错了?

## 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

问题是您正在重命名 $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-----"}
  • foreach 末尾去掉 | Select-Object -ExpandProperty FullName 将消除在第一个 foreach 循环中再次调用 Get-ChildItem 的需要。
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
}