1

I am trying to retrieve the modification date of a file in a locale-independent manner, using the following wmic command:

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

This works perfectly as long as the given file path does not contain any comma ,.

The method below allows commas in the file path but fails if a closing parenthesis ) appears:

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

Up to now, I tried numerous different combinations, but without success:

WHERE Name=D:\\Data\\sample.txt (this fails in general, I guess due to wrong data type)
WHERE Name="D:\\Data\\sample.txt" (this fails with ,)
WHERE Name='D:\\Data\\sample.txt' (this fails with ,)*
WHERE (Name="D:\\Data\\sample.txt") (this fails with ))
WHERE (Name='D:\\Data\\sample.txt') (this fails with ))*
WHERE 'Name="D:\\Data\\sample.txt"' (this fails with ,)
WHERE "Name='D:\\Data\\sample.txt'" (this fails with ,)
WHERE "Name=\"D:\\Data\\sample.txt\"" (this fails with ,)*
WHERE ^"Name=\"D:\\Data\\sample.txt\"^" (this fails with ,)
escaping of , and/or ) with \ does not work either;

*) This attempts that I do not like, because there are no "" involved to enclose the file path, which could lead to problems with delimiters (SPACE, TAB, ;, = and the ,) or special characters like ^, &, ( and ).

So is there any way to allow both characters , and ) in the file path for the wmic query not to fail? Is there any special character (sequence) to escape commas or closing parentheses? Or is there perhaps another method to work around the issue, with a different type of query or WHERE clause?


There is a similar question: How do I escape comma in WMIC inside like string; but its is about escaping the , only and does not fully elaborate on escaping the ) also. That is why I am asking...

2

The method below allows commas in the file path but fails if a closing parenthesis ) appears:

==> 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

On the contrary, the method below allows a closing parenthesis ) in the file path but fails if a comma , appears:

==> 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

It does not look to exist a common approach for both comma , and closing parenthesis ) together in the file path e.g. 2c,comma_28(parens_29).txt.

However, here's a workaround using 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

Output (above code snipped pasted into an open cmd window):

==> 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

==>
  • I can confirm that, contrary to "The method below allows commas in the file path", said method -- wmic DataFile WHERE (Name = "D:\\bat\\Unusual Names\\2c,comma.txt") get Name, LastModified -- does not work if there is one or more commas in a directory name. (e.g., wmic DataFile WHERE (Name = "D:\\a\\Unusual\\2c, Names\\comma.txt") get LastModified) – Rublacava 1 hour ago
  • Maybe this is because it interprets "Unusual\2c, Names" as if "2c, Names" is a subdir of "Unusual" (and not one dir, as it ought to interpret it - "Unusual, Names"). If the directory with the comma is the parent directory of current directory then set "olddirname=dirname2keep" && set "newdirname=nocommadirname" && cd .. && rename "%olddirname%" "%newdirname%" && cd %newdirname% && wmic DataFile WHERE (Name = "D:\\a\\%newdirname%\\comma.txt") get LastModified timeout 2 && cd .. && rename "%newdirname%" "%olddirname%" works (with two newline characters between "LastModified" and "timeout"). – Rublacava 4 mins ago
0

Meanwhile I found an (unfortunately incomprehensive) solution myself, which relies on the fact that there are 8.3 filenames enabled on the target disk drive, because for a filename containing commas a short filename without , is generated, so I only have to regard the closing parenthesis ). For example, the long file path:

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

becomes a short one like:

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

To retrieve the short filename a for loop and the ~s modifier of its meta-variable are used:

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

This nicely even works with a mixed path as input, meaning that the pure filename is short but the directory names in the parent path are long (though this would of course fail when the parent path contains , then):

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.