我尝试使用以下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;但它只是逃避,
,并没有完全阐述逃避)
。这就是我要问的原因......
答案 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