小编asc*_*pfl的帖子

如何比较批处理脚本中文件的时间戳?

在DOS批处理文件中,实现某些事情的方法有些混淆.幸运的是,有一个很棒的批处理脚本参考站点:Simon Sheppard的SS64.(同一网站也有大量关于Bash的信息.)

一个难点是根据目录是否为空来分支执行.显而易见的if exist "%dir%\*.*"是行不通的.但是可以使用这个条件执行技巧来完成:

( dir /b /a "%dir%" | findstr . ) > nul && (
  echo %dir% non-empty
) || (
  echo %dir% empty
)
Run Code Online (Sandbox Code Playgroud)

另一个尴尬的问题是根据文件内容进行分支.再次,可以这样做:

( fc /B "%file1%" "%file2%" | find "FC: no differences encountered" ) > nul && (
  echo "%file1%" and "%file2%" are the same
) || (
  echo "%file1%" and "%file2%" are different
)
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:
有没有办法根据文件的时间戳做分支?

这是我想要的东西:

REM *** pseudo-code!
if "%file1%" is_newer_than "%file2%" (
  echo …
Run Code Online (Sandbox Code Playgroud)

filesystems cmd batch-file

28
推荐指数
6
解决办法
7万
查看次数

带有for循环和管道的批处理脚本

我想在一个目录中的所有csv文件,其文件名不包含单词"summary".在命令提示符下面,我可以输入以下命令

dir /b my_dir\*.csv | find /V "summary"
Run Code Online (Sandbox Code Playgroud)

当我尝试将上述命令转移到批处理文件时,我遇到了一个问题,即for循环中不支持管道命令.那是我不能做到以下几点

FOR /f %%A in ('dir /b my_dir\*.csv | find /V "summary"') do (
rem want to do something here
)
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下如何解决上述问题吗?

提前致谢!

windows for-loop cmd batch-file io-redirection

24
推荐指数
3
解决办法
3万
查看次数

拆分字符串作为分隔符

我正在尝试使用字符串(而不是字符)作为分隔符在批处理文件中拆分字符串.

该字符串的格式为:

string1 by string2.txt
Run Code Online (Sandbox Code Playgroud)

分隔符是by(是的,空格,单词'by',后跟空格).我想要的输出是:

string1

string2
Run Code Online (Sandbox Code Playgroud)

因此,基本上,通过分隔符将字符串拆分为2个部分,by并从第二个字符串中删除后缀.我怎样才能做到这一点?

windows split cmd batch-file

23
推荐指数
3
解决办法
8万
查看次数

Windows中的文件重定向和%errorlevel%

假设我们想要使用以下命令在Windows中创建一个空文件:

type nul > C:\does\not\exist\file.txt
Run Code Online (Sandbox Code Playgroud)

目录不存在,所以我们得到错误:

The system cannot find the path specified
Run Code Online (Sandbox Code Playgroud)

如果你打印%errorlevel%输出是:

echo %errorlevel%
0
Run Code Online (Sandbox Code Playgroud)

但命令没有成功!

我注意到,%errorlevel%如果你使用重定向,窗口不会设置最后一个命令.

有没有解决的办法?

windows error-handling batch-file io-redirection

21
推荐指数
1
解决办法
6285
查看次数

在批处理脚本的for循环中重定向命令输出

...
for /F %%F in ('dir /B %* 2> nul') do (
...
Run Code Online (Sandbox Code Playgroud)

我在这里尝试做的是丢弃命令的错误输出(并在stdout输出上循环).然而,它抱怨:

2> was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

这是实现这个目标的一些方法吗?

for-loop cmd batch-file io-redirection

17
推荐指数
1
解决办法
1万
查看次数

如何在没有外部工具的命令提示符下创建唯一的临时文件路径?

我正在尝试创建要在批处理文件中使用的临时文件的路径.

有环境变量%TEMP%并%TMP%获取当前用户的临时目录.但是如何建立一个肯定还不存在的文件名呢?

当然我可以使用内置变量%RANDOM%并创建类似的东西bat~%RANDOM%.tmp,但是这个方法不能确保文件当前不存在(或者它会在我第一次在磁盘上创建并写入它之前由另一个应用程序巧妙地创建) - 虽然这一切都不太可能.

我知道我可以通过附加%DATE%/ %TIME%或仅添加多个%RANDOM%实例来减少此类冲突的可能性,但这不是我想要的......

注意:根据这篇文章,.NET(Path.GetTempFileName())中有一个方法可以完全满足我的要求(除了显然错误的编程语言).

cmd batch-file

13
推荐指数
1
解决办法
2万
查看次数

robocopy 成功时会导致 exit(1)

我正在尝试在詹金斯中调用此代码

rem copy installation to output folder
set src="C:\code\EPMD\Installer\inno setup\Output"
set dst="c:/test_installs/Calibration/%version_name%"
call robocopy %src% %dst% /MIR /E /is /it
Run Code Online (Sandbox Code Playgroud)

代码运行并工作,在目标文件夹中创建一个新文件。

正如文档所述,这使得 robocopy 返回 1。

然后,它exit 1内部调用,jenkins 认为构建失败。

我怎样才能“捕获”该返回值并且不会使构建失败?

windows cmd batch-file robocopy jenkins

13
推荐指数
1
解决办法
8200
查看次数

Windows批处理脚本删除文件夹中的所有内容,但不包括一个

我有一个脚本删除文件夹中的所有子文件夹和文件:

FOR /D %%i IN ("D:\myfolder\*") DO RD /S /Q "%%i" & DEL /Q "D:\myfolder\*.*"
Run Code Online (Sandbox Code Playgroud)

而且效果很棒!唯一的问题是我想排除一个或多个文件夹,例如XCOPY排除功能.

我只是想不出如何将其添加到脚本中.

windows command-line batch-file

12
推荐指数
1
解决办法
2万
查看次数

为什么我不能在if语句中获得延迟扩展变量的子字符串?

为什么字符串操作在if语句中内联工作而不使用延迟扩展变量 - 否则失败.例如:

set test=testString
if %test:~0,4%==test echo Success
Run Code Online (Sandbox Code Playgroud)

这工作正常; 回来Success.但是,如果我执行以下操作:

setLocal enableDelayedExpansion
set test=testString
if !test:~0,4!==test echo Success
Run Code Online (Sandbox Code Playgroud)

我收到错误 - 4!==test was unexpected at this time.

显然你可以通过在if语句中set comp=!test:~0,4!使用!comp!变量来做到这一点.

cmd if-statement batch-file delayedvariableexpansion

12
推荐指数
2
解决办法
3235
查看次数

如何调用当前目录中一级的批处理文件?

我正在使用批处理文件 folder1/folder2/file.bat

父文件夹中有一个批处理文件folder1,我想打开它file.bat

我尝试过使用:

start ..\..\code.bat
Run Code Online (Sandbox Code Playgroud)

但是这会导致错误消息,因为找不到文件.

有任何想法吗?

batch-file call

12
推荐指数
3
解决办法
6万
查看次数