2009-11-25 92 views
5

我想在powershell中编写脚本来批量转换视频文件。Powershell中的测试路径行为

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

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

而这正是我要加倍努力的地方。问题是Test-Path的行为(我用来测试文件是否存在的cmdlet)。

会发生什么情况是,如果视频文件有一个“不寻常的”名称(例如在我的情况下,它的视频[长] .avi)如果您尝试检查该文件是否存在,Test-Path将始终返回False。

为您测试这样的一个简单的方法是,例如该做的事:

转到一个空文件夹, 运行记事本创建一个文件“[”在它的名字:

&notepad test[x].txt 

保存文件

然后做到这一点:

Get-ChildItem | ForEach-Object {Test-Path $_.FullName} 

它确实不是真的!它应该是对的?那么它不会如果该文件的名称中有[[“(我没有检查任何其他特殊字符)

我意识到,如果你逃脱”[“和”]“它的作品

Test-Path 'test`[x`].txt' 

返回true。

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

感谢, 瑞

回答

8

许多PowerShell命令具有支持通配符路径参数。如您所见,在PowerShell中,不仅*是通配符,而且[]也被视为通配符。您可以在帮助主题about_Wildcards中阅读更多信息。

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

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

仅供参考,管道获取-ChildItem的输出直接进入测试的路径的原因的工作原理是因为LiteralPath参数有一个别名“PSPath”映射到由Get-ChildItem输出的FileInfo对象上的PSPath属性。该属性通过“属性名称”绑定到LiteralPath(呃PSPath)参数。

+0

谢谢,那正是我所需要的 – Rui 2009-11-25 23:12:29

1
dir | % {test-path "$($_.Name)-android.avi"} 
+1

你能详细说一下,为什么$($ _。Name)和“%{}”? – Rui 2009-11-25 23:16:12

+1

'%'和'Foreach'是Forech-Object cmdlet的别名。在一个字符串内部,你可以像''$ _“'那样进行简单的变量扩展,但是如果你想计算一个表达式,比如访问一个对象的属性,你需要使用一个子表达式,例如' “$($ _。名称)”'。 – 2009-11-26 01:20:50