我看到很多关于如何从映射的驱动器号中获取UNC路径的问题,但没有关于反向问题的问题。
在不同的Windows 7企业版计算机上,我使用完全相同的输入,当前目录和网络驱动器映射为FileName
System.Windows.Forms.OpenFileDialog
个实例获得不同的答案:
一台计算机以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
其他人使用映射的驱动路径回答
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
我需要每台计算机都使用映射的驱动器路径来回答:接收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
我需要做什么才能始终获得映射的驱动器路径?
答案 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