gpt4 book ai didi

powershell - Powershell 中的测试路径行为

转载 作者:行者123 更新时间:2023-12-04 17:41:58 32 4
gpt4 key购买 nike

我正在尝试在 powershell 中编写一个脚本来批量转换视频文件。

我打算使用它的方式是转到一些充满视频文件的文件夹并运行它。它使用一个可以在“命令行模式”(名为handbrake)下运行的转换程序,并在文件扩展名之前附加“-android”来保存转换后的文件。例如,如果我在文件夹中有一个名为 video1.avi 的文件,则在运行脚本后该文件夹有 2 个文件:video1.avi 和 video1-android.avi

我想这样做的原因是,我可以检查每个视频文件是否有它的转换版本(名称后附有 -android)。如果是这样,请跳过该文件的转换。

这就是我遇到麻烦的地方。问题是测试路径的行为(我用来测试文件是否存在的 cmdlet)。

发生的情况是,如果视频文件有一个“不寻常”的名称(例如,在我的例子中是 video[long].avi),如果您尝试检查该文件是否存在,Test-Path 总是返回 False。

一个简单的测试方法是例如这样做:

转到一个空文件夹,
运行记事本以创建名称中带有“[”的文件:

&notepad test[x].txt

保存文件

然后这样做:
Get-ChildItem | ForEach-Object {Test-Path $_.FullName}

它不返回真!应该对吧?好吧,如果文件的名称中包含“[”,则不会(我没有检查任何其他特殊字符)

我已经意识到,如果你逃避“[”和“]”它会起作用
Test-Path 'test`[x`].txt'

返回真。

我该如何解决这个问题?我希望能够:给定文件的 BaseName,将其附加到“-android.avi”并检查是否存在具有该名称的文件。

谢谢,

最佳答案

许多 PowerShell cmdlet 具有支持通配符的路径参数。正如您所观察到的,在 PowerShell 中不仅是 *通配符,但 []也被视为通配符。您可以在 about_Wildcards 的帮助主题中了解更多相关信息。

对于您的问题,如果您不需要通配符,那么我建议您使用 -LiteralPath 参数。该参数不支持通配符,接受 []作为文字路径字符,例如:

Get-ChildItem | ForEach {Test-Path -LiteralPath `
"$([io.path]::ChangeExtension($_.FullName,'avi'))"}

仅供引用,将 Get-ChildItem 的输出直接传送到 Test-Path 的原因是因为 LiteralPath 参数有一个别名“PSPath”,该别名映射到 Get-ChildItem 输出的 FileInfo 对象上的 PSPath 属性。该属性“按属性名称”绑定(bind)到 LiteralPath (er PSPath) 参数。

关于powershell - Powershell 中的测试路径行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1799014/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com