Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows CMD/BATCH保留最新的日期戳文件_Windows_Powershell_Batch File_Cmd - Fatal编程技术网

Windows CMD/BATCH保留最新的日期戳文件

Windows CMD/BATCH保留最新的日期戳文件,windows,powershell,batch-file,cmd,Windows,Powershell,Batch File,Cmd,我有一些文件,我想通过排序,并保留最新的文件。 我不能通过修改或创建的文件属性来完成它,我可以做到这一点 以下是文件的命名约定。文件abc_YYYYMMDD.txt 文件abc_20190201.txt 文件abc_20190125.txt 文件abc_20190118.txt 文件abc_20190111.txt 文件abc_20190104.txt 您可以看到日期戳在文件名本身中。这些文件每周生成一次。因此,我希望有一个批处理文件循环通过它们,删除所有,但最新的文件。我真的在寻找如何做到最好

我有一些文件,我想通过排序,并保留最新的文件。 我不能通过修改或创建的文件属性来完成它,我可以做到这一点

以下是文件的命名约定。文件abc_YYYYMMDD.txt

文件abc_20190201.txt 文件abc_20190125.txt 文件abc_20190118.txt 文件abc_20190111.txt 文件abc_20190104.txt 您可以看到日期戳在文件名本身中。这些文件每周生成一次。因此,我希望有一个批处理文件循环通过它们,删除所有,但最新的文件。我真的在寻找如何做到最好,但我没有找到太多,所以我需要一些想法。我更喜欢纯cmd解决方案,但我也对powershell解决方案持开放态度

我自己正在尝试的是用…解析出日期

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%G IN ('dir/b /a-d "C:\Users\thomas.maus\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName\FileABC_*.txt"') do (

            set fileName=%%G 
            Set theDate=!fileName:~8,8!
            echo !theDate!


)
然后我想从循环的结果中提取这些日期,然后做类似的事情

if "%theDate%" GEQ "*****not sure what to put here*****" (
    del *all the old files, also not sure what to put here*
)  
这个怎么样

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do del %%i
如果您只是想测试它,看看它首先会删除什么,请执行以下操作:

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do echo %%i
这个怎么样

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do del %%i
如果您只是想测试它,看看它首先会删除什么,请执行以下操作:

@echo off
for /f "skip=1" %%i in ('dir /o-n /b *.txt') do echo %%i

我们只是循环浏览文件,按日期按降序排序,然后跳过第一个文件,现在是最新的:

@for /f "skip=1" %%a in ('dir /b /o-d *.txt') do @echo @del %%a
重要

此示例将仅作为安全措施响应delete命令,这样您就不会删除不应该拥有的文件。要执行实际删除,请从行中删除@echo

要了解有关我们使用的函数的更多信息,请从cmd.exe运行以下命令

对于/? 目录/?
我们只是循环浏览文件,按日期按降序排序,然后跳过第一个文件,现在是最新的:

@for /f "skip=1" %%a in ('dir /b /o-d *.txt') do @echo @del %%a
重要

此示例将仅作为安全措施响应delete命令,这样您就不会删除不应该拥有的文件。要执行实际删除,请从行中删除@echo

要了解有关我们使用的函数的更多信息,请从cmd.exe运行以下命令

对于/? 目录/?
如果您不关心文件日期,而只关心文件名中的日期,则可以执行以下操作,因为零件文件ABC始终是相同的,并且本身不包含任何uu:

pushd C:\Users\thomas.maus\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName&& 对于/F skip=1 delims=eol=|%%F in' 目录/B/A:-D文件abc_??????.txt^ ^|分拣机 ”“是吗 del%%F 邻苯二胺
尽管sort/R进行字母排序,但这是因为您选择了日期格式,确保字母顺序等于字母数字顺序。

如果您不关心文件日期,而只关心文件名中的日期,则可以执行以下操作:,鉴于零件文件ABC始终相同,且其本身不包含任何uu:

pushd C:\Users\thomas.maus\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName&& 对于/F skip=1 delims=eol=|%%F in' 目录/B/A:-D文件abc_??????.txt^ ^|分拣机 ”“是吗 del%%F 邻苯二胺
尽管sort/R进行字母排序,但这是因为您选择了日期格式,这确保了字母顺序等于字母数字顺序。

作为一个附加选项,以防文件名前缀在整个过程中发生变化,并且只有_YYYYMMDD.txt保持不变,您仍然可以使用该日期对任务进行排序,因为该日期已按字母顺序排序

下面是一个例子:

@Echo Off
Set "SrcDir=%UserProfile%\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName"
For /F "Delims==" %%A In ('Set $ 2^>Nul') Do Set "%%A="
Set "_="
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt 2^>Nul'
) Do Set "_=%%~nA" & Call Set "$%%_:~-8%%=%%A"
If Not Defined _ Exit /B
For /F "Tokens=1* Delims==" %%A In ('Set $ 2^>Nul') Do Set "_=%%B"
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt^|Find /V "%_%"'
) Do Del /A /F "%%A"
这使用了Set命令将按字母顺序输出变量的事实

第2行到第4行只是定义和取消定义我们将要使用的变量。 第5行和第6行是一行,为便于阅读,分为两行。这将使用文件基名称的最后八个字符将变量设置为完整文件名的值。 包括第7行是为了退出脚本,以防在第2行设置的目录中找不到以下划线结尾、后跟八个字符的.txt文件。 第8行是这里的特殊行,它按字母顺序输出每个变量和相应的值。输出被设置为一个变量,该变量将覆盖自身,直到循环结束。这意味着最新的文件(按字母顺序排列的最后一个文件)与以最新日期命名的文件的值一起保存。 为了便于阅读,第9行和第10行再次被分成两行。这将再次遍历目录中所有匹配的文件,并使用Find命令排除将与变量中保存的文件匹配的文件输出为具有最新日期的文件。使用Del命令可以简单地删除每个文件输出。
请注意,此脚本假定每个日期只有一个文件,因为您只声明文件每周生成。

作为附加选项,以防文件名前缀在整个过程中发生更改,并且只有_YYYYMMDD.txt保持不变,您仍然可以使用该日期对任务进行排序,因为该日期已按字母顺序排序

下面是一个例子:

@Echo Off
Set "SrcDir=%UserProfile%\Documents\Tom\dev\Test Batch Files\dev\sortbyFileDateName"
For /F "Delims==" %%A In ('Set $ 2^>Nul') Do Set "%%A="
Set "_="
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt 2^>Nul'
) Do Set "_=%%~nA" & Call Set "$%%_:~-8%%=%%A"
If Not Defined _ Exit /B
For /F "Tokens=1* Delims==" %%A In ('Set $ 2^>Nul') Do Set "_=%%B"
For /F Delims^=^ EOL^= %%A In ('Where "%SrcDir%":*_????????.txt^|Find /V "%_%"'
) Do Del /A /F "%%A"
这使用了Set命令将按字母o输出变量的事实 订单

第2行到第4行只是定义和取消定义我们将要使用的变量。 第5行和第6行是一行,为便于阅读,分为两行。这将使用文件基名称的最后八个字符将变量设置为完整文件名的值。 包括第7行是为了退出脚本,以防在第2行设置的目录中找不到以下划线结尾、后跟八个字符的.txt文件。 第8行是这里的特殊行,它按字母顺序输出每个变量和相应的值。输出被设置为一个变量,该变量将覆盖自身,直到循环结束。这意味着最新的文件(按字母顺序排列的最后一个文件)与以最新日期命名的文件的值一起保存。 为了便于阅读,第9行和第10行再次被分成两行。这将再次遍历目录中所有匹配的文件,并使用Find命令排除将与变量中保存的文件匹配的文件输出为具有最新日期的文件。使用Del命令可以简单地删除每个文件输出。
请注意,此脚本假定您每个日期只有一个文件,因为您只声明文件每周生成。

您提供的文件已按日期顺序排列,最新的排在第一位,并且您分配给它们的名称可按字母顺序排序,这意味着最新的将始终列在第一位或最后一位,这取决于排序顺序。我并不是真的试图对它们进行排序或排序。我只想删除除最新文件以外的所有文件。我分析了日期,所以我可以尝试做一些数学运算,以获得最长的日期,然后使用某种逻辑删除比最新日期更早的任何内容。你不能对文本字符串进行数学运算,您可以做的是在公共分隔符处拆分名称对日期部分的文件进行排序,并按排序或反向排序的顺序删除它们,除了一个!这里有许多现有的帖子应该可以给你一个开始。试试这些,例如:零件文件ABC是否可以单独包含一个字符?您提供的文件已经按日期顺序排列,最新的排在第一位,并且指定给它们的名称可以按字母顺序排序,这意味着最新的将始终列在第一位或最后一位,这取决于排序顺序。我并不是真的试图对它们进行排序或排序。我只想删除除最新文件以外的所有文件。我分析了日期,所以我可以尝试做一些数学运算,以获得最长的日期,然后使用某种逻辑删除比最新日期更早的任何内容。你不能对文本字符串进行数学运算,您可以做的是在公共分隔符处拆分名称对日期部分的文件进行排序,并按排序或反向排序的顺序删除它们,除了一个!这里有许多现有的帖子应该可以给你一个开始。试一试这些,例如:零件文件ABC是否可以单独包含一个字符?谢谢你,这样做很有效,我也很感谢你的解释。谢谢你,这样做很有效,我也很感谢你的解释。