0

我正在尝试创建昨天创建的文件列表。

我在没有 /c:"cmd /c echo @path" 的情况下可以正常工作,但我想要完整路径。

forfiles /s /d -1 /m *.txt /c:"cmd /c echo @path" > a.txt
forfiles /s /m *.txt /c:"cmd /c echo @path" > b.txt
FOR /f "delims=; tokens=*" %%X IN ('findstr /v /g:a.txt b.txt') DO (
    echo %%X
)

将 findstr 与包含反斜杠的路径一起使用来解决此问题的最佳方法是什么?我是否需要用其他符号替换比较文件中的所有反斜杠,然后稍后再将其更改回来,还是在 findstr 行中有更简单的方法?

4

2 回答 2

0

对于此类任务,我更喜欢

Get-ChildItem -Path "C:\Users\tivrick" -Recurse -ErrorAction SilentlyContinue | Where-Object { -Not $_.PSIsContainer -And $_.CreationTime.Date -Eq (Get-Date).Date.AddDays(-1) } | Select-Object -ExpandProperty FullName

如果您确实需要从运行它:

@PowerShell -NoP "GCI "C:\Users\tivrick" -R -EA SilentlyContinue|?{!$_.PSIsContainer -And $_.CreationTime.Date -Eq (Get-Date).Date.AddDays(-1)}|Select -Exp FullName"
于 2019-07-22T17:16:29.767 回答
0

findstr命令检查第一个搜索表达式并在找到元字符时更改为正则表达式模式,否则更改为文字模式,除非您通过/L(literal) 或/R(regular expression) 显式预定义模式。

但是findstr这是一个讨厌的野兽,因为即使使用以下方法仍然存在一些问题/L

  • 使用多个文字搜索字符串可能会返回错误的结果,除非您指定/I进行不区分大小写的搜索;但这无论如何都不是问题,因为您正在处理目录和文件名,Windows 无论如何都会不区分大小写地处理它们;
  • 尽管在文字模式下,当前面有 a 时,仍然会发生像., [, ], ^, $, \, *and这样的元字符的转义;你可以加倍来解决这个问题;?\\

所以下面的代码应该在大多数情况下都可以工作; 此处通过 启用延迟扩展,这是读取在同一命令行中写入cmd /V读取的临时变量所必需的:FILE

forfiles /S /M "*.txt" /D -1 /C "cmd /C if @isdir==FALSE (set FILE=@path) & cmd /V /C echo(!FILE:\=\\!" > "exclude.txt"
forfiles /S /M "*.txt"       /C "cmd /C if @isdir==FALSE echo @path" > "all.txt"
for /F "delims=" %%X in ('findstr /V /L /I /X /G:"exclude.txt" "all.txt"') do (
    echo(%%X
)

我在此处插入if @isdir==FALSE以不匹配名称以.txt. 我还添加/X了以findstr仅匹配整行/路径。

请注意,文字findstr搜索字符串的长度限制为 511 个字节(加倍之后\),可以通过文件路径轻松访问。


但是,完全避免的不同方法又findstr如何呢?

这是我曾经提供的一篇文章,用于返回比相对日期更新的项目forfilesFORFILES date -after- (date calc in cmd file)

于 2019-07-22T19:57:41.447 回答