powershell 确定用户是否提供了目录、文件、完整路径或其他内容

kwvwclae  于 2023-11-18  发布在  Shell
关注(0)|答案(1)|浏览(158)

这是一个问题,我已经遇到了一年,我永远无法达到一个完整的解决方案,尽管我的努力.因此,作为一个结果,有一堆命令/模块,不遵循任何一致的模式,如何可以提供一个目标路径.
我想知道是否有共同的解决方案。
我需要用户(或我自己)为“destination”参数提供一个值,但允许它以灵活的方式完成,例如能够:

  • 只提供一个文件名(带扩展名),在这种情况下,我将使用$pwd构造一个完整路径
  • 只提供一个文件名(没有扩展名),在这种情况下,我将使用$pwd和输入文件扩展名(-Path值)来构造一个完整路径
  • 只提供一个目录路径,例如c:\temp,在这种情况下,我将从输入文件(-Path值)派生文件名。
  • 提供相对路径
  • 提供完整路径

以下是我想到的典型调用:

NewSnippetFrom-Video -Path "c:\vid\LongVideo.mp4" <options> Destination "-Destination "ShortVideo" 
NewSnippetFrom-Video -Path "c:\vid\LongVideo.mp4" <options> Destination "-Destination "ShortVideo.mp4" 
NewSnippetFrom-Video -Path "c:\vid\LongVideo.mp4" <options> Destination "-Destination "\ShortVideo.mp4"
NewSnippetFrom-Video -Path "c:\vid\LongVideo.mp4" <options> Destination "-Destination ".\ShortVideo.mp4"
NewSnippetFrom-Video -Path "c:\vid\LongVideo.mp4" <options> Destination "-Destination "c:\temp"
NewSnippetFrom-Video -Path "c:\vid\LongVideo.mp4" <options> Destination "-Destination "c:\temp\ShortVideo.mp4"

字符串
每次,我都试图自己解决这个问题,我的阻塞点是找到一个PowerShell函数/命令,我可以用来实现逻辑.今天阅读文档的test-path我认为它会做,文档说:
Test-Path小程序确定路径的所有元素是否存在.它还可以判断路径语法是否有效,以及路径是否指向容器或终端或叶元素
但我对指挥官的测试并不能证明这一点。

test-path -path "LongVideo|.mp4" -PathType leaf -IsValid        #Returns True 
test-path -path "c:LongVideo:test.mp4" -PathType leaf -IsValid  #Returns True 
test-path -path "c:LongVideo:\test.mp4" -PathType leaf -IsValid #Returns True


在上面的例子中,我希望-PathType leaf只测试名称和扩展名。LongVideo|.mp4c:LongVideo:\test.mp4不是有效的文件名,那么为什么它告诉我它是有效的?
我正在考虑使用正则表达式来验证自己的值,但由于我打算将其用作许多命令/PS1/模块的通用“组件”,因此我希望有一个最佳解决方案。
我也很想听到或看到如何处理这个问题的例子。干杯。

gopyfrb3

gopyfrb31#

在PowerShell版本6.1.2之前,当-IsValid-PathType一起用于验证目的时会出现问题。(MSDN PS7.3)
首先,如果指定了-IsValid,-PathType开关将被忽略,而且只进行语法路径验证。
其次,-PathType本身测试路径中的最后一个元素是否属于特定类型,而不管路径字符串是什么。
这里有一个很棒的discussion of the issue on Github,它提供了更多的细节。

test-path -path "LongVideo|.mp4" -PathType leaf         #Returns False 
test-path -path "c:LongVideo:test.mp4" -PathType leaf   #Returns False (and throws "Illegal characters in path" error.)
test-path -path "c:LongVideo:\test.mp4" -PathType leaf  #Returns False

字符串
您可以尝试使用$path -Split "\\"Split-Path进一步分析路径及其部分,但是,这听起来很有趣。

$path = "c:\LongVideo:\sub|\other\test|.mp4"
$pathIntoArray = $path -Split "\\"
$pathIntoArray | ForEach-Object { $cleaned = Remove-InvalidFileNameChars($_);
                                  $cleaned.Equals($_); } #was anything removed?

$pathParent = Split-Path $path -Parent
$pathLeaf = Split-Path $path -Leaf
$pathQualifier = Split-Path $path -Qualifier
$pathIsAbsolute = Split-Path $path -IsAbsolute
$pathIntoArray = @("Parent of the path: $pathParent", 
                   "Leaf of the path: $pathLeaf",
                   "Qualifier of the path: $pathQualifier",
                   "Is the path absolute? (True/False): $pathIsAbsolute")
$pathIntoArray


考虑到这一点,我可能会避免过多地摆弄,而只是使用try-catch来处理边缘情况(也许可以自己删除非法字符,例如使用上面的函数here)。

相关问题