如何在WMIC的WHERE子句中转义逗号和右括号?

时间:2016-05-12 21:58:49

标签: cmd wmi wmic

我尝试使用以下wmic命令以与语言环境无关的方式检索文件的修改日期:

wmic DataFile WHERE Name="D:\\Data\\sample.txt" GET LastModified

只要给定的文件路径不包含任何逗号,,就可以正常工作。

下面的方法允许在文件路径中使用逗号,但如果出现右括号)则会失败:

wmic DataFile WHERE (Name="D:\\Data\\sample.txt") GET LastModified

到目前为止,我尝试了许多不同的组合,但没有成功:

  

WHERE Name=D:\\Data\\sample.txt(这通常会失败,我猜是因为错误的数据类型)
  WHERE Name="D:\\Data\\sample.txt" {这与,}失败了   WHERE Name='D:\\Data\\sample.txt'(这与, *
失败   WHERE (Name="D:\\Data\\sample.txt") {这与)}失败了   WHERE (Name='D:\\Data\\sample.txt')(这与) *
失败   WHERE 'Name="D:\\Data\\sample.txt"' {这与,}失败了   WHERE "Name='D:\\Data\\sample.txt'" {这与,}失败了   WHERE "Name=\"D:\\Data\\sample.txt\""(这与, *
失败   WHERE ^"Name=\"D:\\Data\\sample.txt\"^" {这与,}失败了   使用,转义)和/或\也不起作用;

<子> *)这是我不喜欢的尝试,因为没有""涉及封闭文件路径,这可能导致分隔符出现问题( SPACE TAB ;=,)或特殊字符,例如^&()

那么有没有办法让,查询的文件路径中的字符)wmic都不会失败?是否有任何特殊字符(序列)来逃避逗号或关闭括号?或者是否有另一种方法可以解决该问题,使用不同类型的查询或WHERE子句?

有一个类似的问题:How do I escape comma in WMIC inside like string;但它只是逃避,,并没有完全阐述逃避)。这就是我要问的原因......

3 个答案:

答案 0 :(得分:2)

  

下面的方法允许文件路径中的逗号,但如果关闭则会失败   出现括号)

==> wmic DataFile WHERE (Name = "D:\\bat\\Unusual Names\\2c,comma.txt") get Name, LastModified
LastModified               Name
20160513080305.362206+120  d:\bat\unusual names\2c,comma.txt

相反,下面的方法允许在文件路径中使用右括号),但如果出现逗号,则会失败:

==> wmic DataFile WHERE "Name = 'D:\\bat\\Unusual Names\\28(parens_29).txt'" get Name, LastModified
LastModified               Name
20160513104341.746838+120  d:\bat\unusual names\28(parens_29).txt

对于文件路径中的逗号, 结束括号) 一起,它看起来并不常见,例如2c,comma_28(parens_29).txt

但是,这是使用PowerShell的解决方法:

powershell -Command Get-WmiObject -Query """Select * from CIM_DataFile where name = 'D:\\bat\\Unusual Names\\2c,comma_28(parens_29).txt'""" ^| select name, LastModified ^| ft -AutoSize
::
::  a bit more readable
::
powershell -Command Get-WmiObject -Query """Select * from CIM_DataFile where "^
  "name = 'D:\\bat\\Unusual Names\\2c,comma_28(parens_29).txt'""" ^
  ^| select name, LastModified ^| ft -AutoSize
::
:: even more readable
::
set "_filePath=D:\bat\Unusual Names\2c,comma_28(parens_29).txt"
powershell -Command Get-WmiObject -Query ^
  """Select * from CIM_DataFile where name = '%_filePath:\=\\%'""" ^
  ^| select name, LastModified ^| ft -AutoSize

输出(以上代码剪切粘贴到打开的cmd窗口中):

==> powershell -Command Get-WmiObject -Query """Select * from CIM_DataFile where
 name = 'D:\\bat\\Unusual Names\\2c,comma_28(parens_29).txt'""" ^| select name,
LastModified ^| ft -AutoSize

name                                            LastModified
----                                            ------------
d:\bat\unusual names\2c,comma_28(parens_29).txt 20160513103717.765243+120

==> ::
==> ::  a bit more readable
==> ::
==> powershell -Command Get-WmiObject -Query """Select * from CIM_DataFile where "^
More?   "name = 'D:\\bat\\Unusual Names\\2c,comma_28(parens_29).txt'""" ^
More?   ^| select name, LastModified ^| ft -AutoSize

name                                            LastModified
----                                            ------------
d:\bat\unusual names\2c,comma_28(parens_29).txt 20160513103717.765243+120

==> ::
==> :: even more readable
==> ::
==> set "_filePath=D:\bat\Unusual Names\2c,comma_28(parens_29).txt"

==> powershell -Command Get-WmiObject -Query ^
More?   """Select * from CIM_DataFile where name = '%_filePath:\=\\%'""" ^
More?   ^| select name, LastModified ^| ft -AutoSize

name                                            LastModified
----                                            ------------
d:\bat\unusual names\2c,comma_28(parens_29).txt 20160513103717.765243+120

==>

答案 1 :(得分:1)

解决方案:

D:\>mklink /H "1.jpg" "D:\p\a\t\h\fi,le.jpg"
Hardlink created for 1.jpg <<===>> D:\p\a\t\h\fi,le.jpg

D:\>wmic datafile where Name="D:\\1.jpg" list /format:list

我了解不希望重命名文件,查看其元数据,然后将其重命名回其原始文件名。我重试了@JosefZ解决方案,但它们没有起作用。我还尝试了JosefZ的Powershell解决方案,但没有成功。 @aschipfl-当我在cmd中运行dir/x时,Windows 10未显示NTFS外部HDD中文件的8.3文件名。 (Windows 7确实显示了这样的文件名,而运行fsutil behavior set disable8dot3 0并不能在Windows 10中修复它。)

这不是一个完美的解决方案,因为wmic并不是一个完美的程序。也有在转义逗号时遇到麻烦的用户: Escaping strings when using wmic

答案 2 :(得分:0)

与此同时,我自己发现了一个(很不全面的)解决方案,它依赖于以下事实:目标磁盘驱动器上启用了8.3 filenames,因为对于包含逗号的文件名,短文件名不带,是生成,因此我只需要考虑右括号)。例如,长文件路径:

"D:\Testing Data\(sh)f,n.txt"

成为一个简短的类似:

"D:\TESTIN~1\(SH)F_~1.txt"

要检索短文件名,请使用for loop及其元变量的~s modifier

rem // Return full file path with only short names:
for %%F in ("D:\Testing Data\(sh)f,n.txt") do @set "FILE=%%~sfF"

wmic DataFile WHERE "EightDotThreeFileName='%FILE:\=\\%'" GET LastModified

这甚至可以使用混合路径作为输入,这意味着纯文件名很短,但是父路径中的目录名很长(尽管当父路径包含,时,这当然会失败) :

rem // Return long parent path and short filename:
for %%F in ("D:\Data\(sh)f,n.txt") do @set "PPTH=%~dpF" & @set "NAME=%%~snxF"

wmic DataFile WHERE "EightDotThreeFileName='%PPTH:\=\\%%NAME%'" GET LastModified