如何从.NET文件对话框中获取映射网络驱动器的路径

时间:2014-09-07 21:16:20

标签: .net windows powershell openfiledialog

我看到很多关于如何从映射的驱动器号中获取UNC路径的问题,但没有关于反向问题的问题。

在不同的Windows 7企业版计算机上,我使用完全相同的输入,当前目录和网络驱动器映射为FileName System.Windows.Forms.OpenFileDialog个实例获得不同的答案:

  1. 一台计算机以UNC路径回答

    PS A:\Liver\Department\Records\check log> .\sign-log.ps1
    VERBOSE: Writing signature to \\liver53-pc.ad.institute.edu\Documents\Liver\Department\Records\check log\00\check log.xlsx.sig
    
  2. 其他人使用映射的驱动路径回答

    PS A:\Liver\Department\Records\check log> .\sign-log.ps1
    VERBOSE: Writing signature to A:\Liver\Department\Records\check log\00\check log.xlsx.sig
    
  3. 我需要每台计算机都使用映射的驱动器路径来回答:接收FileName的命令行程序并不了解UNC路径。 以下是sign-log.ps1

    的内容
    Add-Type -AssemblyName System.Windows.Forms
    function Sign-Log ($file = '.\check-log.xlsx') {
        $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog -Property @{
            Title = 'Select'
            ; InitialDirectory = (Get-Location).Path
            ; Filename = 'check log.xlsx'
            ; Filter = 'Excel Spreadsheet (*.xlsx;*.xls)|*.xlsx;*.xls|Any file (*.*)|*.*'
            ; ShowHelp = $true
        }
        if ($FileBrowser.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
            $file = $FileBrowser.FileName
            $dest = $file + '.sig'
            if (Test-Path -Path $dest) {
                Write-Verbose -Message ('Appending signature to {0}' -f $dest)
                Add-Content -Path $dest -Value (gpg '-ao' '-' '-b' $file)
            } else {
                Write-Verbose -Message ('Writing signature to {0}' -f $dest)
                gpg '-ao' $dest '-b' $file
            }
            gpg '--verify' $dest
        }
        $FileBrowser.Dispose()
    }
    Sign-Log
    

    我需要做什么才能始终获得映射的驱动器路径?

1 个答案:

答案 0 :(得分:1)

我认为最好的选择是测试返回的UNC路径,如果是,请暂时将其映射到驱动器号,然后将其发送到gpg。也许是这样的:

if (([uri]$dest).IsUnc) {
    $destPath = $dest | Split-Path -Parent
    # Find a free drive letter
    $letter = ls function:[d-z]: -n | ?{ !(test-path $_) } | Select-Object -Last 1
    New-PSDrive -Name $letter[0] -Root $destPath -Persist -PSProvider FileSystem
    $dest = $destPath | Join-Path -ChildPath $file
}

# Then after you're done calling gpg:
if ($destPath) {
    Remove-PSDrive -Name $letter[0] -Force
}

这是未经测试的..

获取免费信件的单行代码来自:Getting a free drive letter

New-PSDrive Reference

Remove-PSDrive Reference