【问题标题】:PowerShell: "The given path's format is not supported" when path does not contain folders. Using Split-PathPowerShell:当路径不包含文件夹时,“不支持给定路径的格式”。使用拆分路径
【发布时间】:2021-01-21 19:38:43
【问题描述】:

我有一个函数可以返回带有完整路径的文件夹名称,例如 C:\Folder\Subfolder。

然后我使用拆分路径提取子文件夹的名称。

当它的文件夹或子文件夹(如 C:\Folder 或 C:\Folder\Subfolder)时,它的工作方式与预期一样,但在选择驱动器时则不然

这是我的代码。 “获取文件夹”功能只是一个文件对话框,用户可以在其中选择文件夹:

$FolderNavn = Get-Folder

$FolderNavnKort = Split-Path -Path $Foldernavn -Leaf

这就是我所期待的:

如果文件夹是 'C:\Folder\Subfolder' 它应该返回 "Subfolder" (works)

如果文件夹只是 'C:\Folder' 它应该返回 "Folder" (works)

如果选择 C:\(因此不是文件夹)应该返回“”,但我得到:

Out-File : 不支持给定路径的格式。

当我在测试时,$FolderNavn 返回“C:\”。

有什么建议吗?

编辑,Get-Folder 的内容:

function Get-Folder {
[CmdletBinding()]
param (
    [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=0)]
    [string]$Message = "Please select a directory.",

    [System.Environment+SpecialFolder]$InitialDirectory = [System.Environment+SpecialFolder]::MyComputer,

    [switch]$ShowNewFolderButton
)
Add-Type -AssemblyName System.Windows.Forms
$dialog = New-Object System.Windows.Forms.FolderBrowserDialog
$dialog.Description = 'Select a directory.'
$dialog.RootFolder  = $InitialDirectory
$dialog.ShowNewFolderButton = if ($ShowNewFolderButton) { $true } else { $false }
$selected = $null

# force the dialog TopMost
# Since the owning window will not be used after the dialog has been 
# closed we can just create a new form on the fly within the method call
$result = $dialog.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true }))
if ($result -eq [Windows.Forms.DialogResult]::OK){
    $selected = $dialog.SelectedPath
}
# clear the FolderBrowserDialog from memory
$dialog.Dispose()
# return the selected folder
$selected

}

【问题讨论】:

  • 你能分享你的“Get-Folder”脚本的内容吗?在我的电脑上运行$foldername = Split-Path -Path C:\ -Leaf$foldername 设置为“C:\”
  • 另外,“Out-File”部分在哪里发挥作用?
  • @GuyS 我已经添加了脚本。感谢您抽出宝贵时间!
  • Out-File 在这里发挥作用:'$KanalNavne |输出文件 -FilePath $KanalerStiNavn -Encoding utf8 -Append'
  • $KanalerStiNavn 需要是一个文件名 - 当您调用 Out-File 时的值是什么?你能把那部分也发一下吗?

标签: powershell


【解决方案1】:

根据一些研究,这似乎是由于文件路径中多了一个冒号。如果没有与构建路径/文件 ($KanalerStiNavn) 相关的代码,我的猜测是它正在尝试使用您在本行前面检索的叶子子文件夹创建一个文件夹。

$FolderNavnKort = Split-Path -Path $Foldernavn -Leaf

当您有一个子文件夹(例如您的示例中的“子文件夹”、“文件夹”)时,可以在 Out-File 命令中将返回值创建为所需目录中的文件夹。不幸的是,当(在上一行中)您的 $foldernavn 是根目录时,它会返回“C:\”作为文件夹,并且您尝试在另一个目录中创建一个文件夹,包括该文件夹

# Assuming the root export folder is D:\newfolder
# When $foldernavn is C:\folder (and therefore $FolderNavnKort is "folder")
$KanalerStiNavn could be "D:\newfolder\folder"

# When $foldernavn is C:\ (and therefore $FolderNavnKort is "C:\")
$KanalerStiNavn could be "D:\newfolder\C:\"

第二个例子是一个无效的文件名,因此是错误的。

要更正此问题,您需要处理Split-Path 函数的返回值包含冒号的情况。可以这么简单:

if ($FolderNavnKort -like "*:*")
{
    $FolderNavnKort = ""
}

不算太漂亮,但应该能胜任。

【讨论】:

  • 感谢您的建议,但这也会导致像 C:\FOO 这样的文件夹被返回为“”而不是“FOO”,但我想我可以使用正则表达式(叹气!)或使IF 改为 $FolderNavn,然后进行 IF-THEN-ELSE。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-09-14
  • 2011-11-13
  • 2012-04-21
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多