这是一个问题,我已经遇到了一年,我永远无法达到一个完整的解决方案,尽管我的努力.因此,作为一个结果,有一堆命令/模块,不遵循任何一致的模式,如何可以提供一个目标路径.
我想知道是否有共同的解决方案。
我需要用户(或我自己)为“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|.mp4
或c:LongVideo:\test.mp4
不是有效的文件名,那么为什么它告诉我它是有效的?
我正在考虑使用正则表达式来验证自己的值,但由于我打算将其用作许多命令/PS1/模块的通用“组件”,因此我希望有一个最佳解决方案。
我也很想听到或看到如何处理这个问题的例子。干杯。
1条答案
按热度按时间gopyfrb31#
在PowerShell版本6.1.2之前,当
-IsValid
和-PathType
一起用于验证目的时会出现问题。(MSDN PS7.3)首先,如果指定了
-IsValid
,-PathType开关将被忽略,而且只进行语法路径验证。其次,
-PathType
本身测试路径中的最后一个元素是否属于特定类型,而不管路径字符串是什么。这里有一个很棒的discussion of the issue on Github,它提供了更多的细节。
字符串
您可以尝试使用
$path -Split "\\"
和Split-Path
进一步分析路径及其部分,但是,这听起来很有趣。型
考虑到这一点,我可能会避免过多地摆弄,而只是使用try-catch来处理边缘情况(也许可以自己删除非法字符,例如使用上面的函数here)。