在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) 我想在一个目录中的所有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)
有人可以解释一下如何解决上述问题吗?
提前致谢!
我正在尝试使用字符串(而不是字符)作为分隔符在批处理文件中拆分字符串.
该字符串的格式为:
string1 by string2.txt
Run Code Online (Sandbox Code Playgroud)
分隔符是by(是的,空格,单词'by',后跟空格).我想要的输出是:
string1
string2
Run Code Online (Sandbox Code Playgroud)
因此,基本上,通过分隔符将字符串拆分为2个部分,by并从第二个字符串中删除后缀.我怎样才能做到这一点?
假设我们想要使用以下命令在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%如果你使用重定向,窗口不会设置最后一个命令.
有没有解决的办法?
...
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)
这是实现这个目标的一些方法吗?
我正在尝试创建要在批处理文件中使用的临时文件的路径.
有环境变量%TEMP%并%TMP%获取当前用户的临时目录.但是如何建立一个肯定还不存在的文件名呢?
当然我可以使用内置变量%RANDOM%并创建类似的东西bat~%RANDOM%.tmp,但是这个方法不能确保文件当前不存在(或者它会在我第一次在磁盘上创建并写入它之前由另一个应用程序巧妙地创建) - 虽然这一切都不太可能.
我知道我可以通过附加%DATE%/ %TIME%或仅添加多个%RANDOM%实例来减少此类冲突的可能性,但这不是我想要的......
注意:根据这篇文章,.NET(Path.GetTempFileName())中有一个方法可以完全满足我的要求(除了显然错误的编程语言).
我正在尝试在詹金斯中调用此代码
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 认为构建失败。
我怎样才能“捕获”该返回值并且不会使构建失败?
我有一个脚本删除文件夹中的所有子文件夹和文件:
FOR /D %%i IN ("D:\myfolder\*") DO RD /S /Q "%%i" & DEL /Q "D:\myfolder\*.*"
Run Code Online (Sandbox Code Playgroud)
而且效果很棒!唯一的问题是我想排除一个或多个文件夹,例如XCOPY排除功能.
我只是想不出如何将其添加到脚本中.
为什么字符串操作在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!变量来做到这一点.
我正在使用批处理文件 folder1/folder2/file.bat
父文件夹中有一个批处理文件folder1,我想打开它file.bat
我尝试过使用:
start ..\..\code.bat
Run Code Online (Sandbox Code Playgroud)
但是这会导致错误消息,因为找不到文件.
有任何想法吗?
batch-file ×10
cmd ×7
windows ×5
for-loop ×2
call ×1
command-line ×1
filesystems ×1
if-statement ×1
jenkins ×1
robocopy ×1
split ×1