我正在尝试创建一个可以将其他文件放到其上的批处理文件.具体来说,我正在使用ffmpeg来编辑手持录音机产生的音频文件.问题是当使用带有&符号的文件名时(&).即使在引用输入时,&之后的任何内容都会被删除,但只有当文件被丢弃时才会被删除; 如果在命令行输入文件名输入,则脚本可以正常工作.在cmd
窗口关闭之前,我会短暂地看到文件名的其余部分,并显示一条错误消息,说明它未被识别为有效命令.
这是我的脚本:
rem Change to drive and directory of input file %~d1 cd %~p1 rem ffmpeg: mix to one channel, double the volume %HOMEDRIVE%%HOMEPATH%\ffmpeg.exe -i "%~nx1" -ac 1 -vol 1024 "%~n1 fixed%~x1" pause
这是删除后命令行上显示的内容"ch17&18.mp3"
:
C:\Users\computergeeksjw\Desktop>C:\Users\computergeeksjw\ffmpeg.exe -i "ch17" -ac 1 -vol 1024 "ch17 fixed" [...] ch17: No such file or directory
如果重要:我正在使用Windows 8开发人员预览版.这会导致我的问题吗?Windows 7或更早版本是否会出现相同的错误?
我正在尝试通过.cmd文件自动化我使用测试套件创建的程序.
我可以通过%errorlevel%获取我运行的返回代码的程序.
我的程序对每种类型的错误都有一定的返回码.
例如:
1 - 意味着因为这样的原因而失败
2 - 由于某些其他原因意味着失败
...
echo FAILED:测试用例失败,错误级别:%errorlevel%>> TestSuite1Log.txt
相反,我想以某种方式说:
echo FAILED:测试用例失败,错误原因:lookupError(%errorlevel%)>> TestSuite1Log.txt
这是否可以使用.bat文件?或者我是否必须转向像python/perl这样的脚本语言?
我在互联网上查了一些例子,但我无法让我的(第一个)批处理文件工作.我想自动将文件从一个文件夹复制到另一个文件夹,但没有任何反应.
@echo off
xcopy "C:\source\" "C:\target\" /c /d /i /y
exit
Run Code Online (Sandbox Code Playgroud)
你能看到什么问题吗?
谢谢!!
更新:我完成了巴厘岛C给出的命令,但它仍然无效.查看快照
xcopy C:\folder1 C:\folder2\folder1 /t /e /i /y
xcopy C:\folder1 C:\folder2\ /t /e /i /y
Run Code Online (Sandbox Code Playgroud)
我必须用CTRL + C来阻止它.
PS:我在Win 7上
更新(解决方案):它有效!问题是名称xcopy,bat在我的桌面上,我从那里运行命令,所以它正在执行我的桌面而不是Windows的xcopy.bat文件.我不得不用"myxcopy"重命名该文件.蝙蝠":
@echo off
xcopy "C:\source" "C:\target" /c /d /i /y
exit
Run Code Online (Sandbox Code Playgroud) 我试图从环境变量字符串中删除星号,但似乎无法做到.
我正在创建一个基于搜索字符串的m3u文件,所以例如如果我想制作一个m3u文件,其中包含每个包含爱字的歌曲,我会输入:
m3u *Love*
Run Code Online (Sandbox Code Playgroud)
并且m3u.bat将创建该文件:
xLovex.m3u
Run Code Online (Sandbox Code Playgroud)
但是替换字符的常规方法不适用于星号.(虽然我对问号没有这个问题.)
set nam=%nam:*=x%.m3u
Run Code Online (Sandbox Code Playgroud)
而是创建文件名
x.m3u
Run Code Online (Sandbox Code Playgroud) 该命令for
可用于枚举目录并对每个项目应用(a)某些命令.对于/R
完整的目录树,可以实现相同的功能.
当枚举目录(树)的内容被命令体中的for
命令改变时会发生什么?
假设我们的目录D:\data
包含以下内容:
file1.txt
file2.txt
file3.txt
Run Code Online (Sandbox Code Playgroud)
for %F in ("*.txt") do echo %F
在所述目录中执行的输出显然将反映上面的列表.
但是,for
当for
正文中的命令修改目录内容时,循环的输出是什么?例如,在file3.txt
实际迭代之前,列表中的一个文件被删除了吗?或者,如果file4.txt
在完成循环之前创建了一个新文件,例如?
for /R
在这种情况下表现如何?假定有几个子目录sub1
,sub2
,sub3
,每个包含的文件的上述列表; for /R
目前正在迭代sub2
,sub1
已经处理,但sub3
还没有; 那个时候的内容sub1
和sub3
改变(当前正sub2
如上所述走过的时候); 那将会列举什么?我猜,内容的变化sub1
不会被识别,但是怎么样sub3
?
最后,在命令提示符或批处理文件中执行for
或for /R
执行时的行为是否存在差异?不同的Windows版本有差异吗?
注意:
另请参阅我关于该命令的类似问题forfiles
.
我破坏了一些代码,这些代码应该删除没有以值为开头的名称的文件keep
.我通过将文件的名称放入tmpL1
并且tmpL2
在替换keep
没有任何值的情况下实现此目的.如果tmpL1
和tmpL2
不同我保留文件,否则它将被删除.
setlocal enabledelayedexpansion
set keep=[File I want to keep]
for /F %%L IN ('dir /b *') do (
set tmpL1=%%L
set tmpL2=!tmpL1:%keep%=!
if !tmpL1!==!tmpL2! (
echo.[REMOVE]
) else (
echo.[KEEP]
)
)
Run Code Online (Sandbox Code Playgroud)
这工作正常.但是,当我将此代码放在一个更大的脚本中时,设置tmpL2
突然停止工作.而不是(部分)文件名tmpL2
现在字面上包含tmpL1:=
.
这是我想要使用它的脚本.附加的for
-loops仅用于浏览目录树.脚本的主要功能仍然相同.
setlocal enabledelayedexpansion
for /F %%G in ('dir /b *-snapshots') do (
set tmpG1=%%G
for /F %%H in ('dir /b !tmpG1!\*') do (
set tmpH1=%%H
for /F …
Run Code Online (Sandbox Code Playgroud) 我正在处理一个批处理文件,我想知道为什么有些变量周围有双引号而其他变量没有,例如?
SET "keePass=%USERPROFILE%\KeePass\KeePass-2.31\KeePass.exe"
Run Code Online (Sandbox Code Playgroud)
但是这个:
SET name="bob"
Run Code Online (Sandbox Code Playgroud)
为什么第一个中的双引号,而不是第二个?
假设存在执行另一个批处理文件(被调用者)的批处理文件(调用者),则call
需要使用该命令以便在被调用者完成执行后返回调用者.这是一个例子:
caller.bat
:
echo Calling another script...
call callee.bat
echo Returned from callee...
Run Code Online (Sandbox Code Playgroud)
callee.bat
(在同一地点):
echo Being called from caller...
Run Code Online (Sandbox Code Playgroud)
输出将是这个(省略命令echos),表明执行按预期返回:
Run Code Online (Sandbox Code Playgroud)Calling another script... Being called from caller... Returned from callee...
如果call
命令在调用者中被解除,则输出将为:
Run Code Online (Sandbox Code Playgroud)Calling another script... Being called from caller...
但是一旦被调用者涉及管道(|
),则call
命令是否被使用没有区别.例如:
caller.bat
(被调用者保持不变):
echo Calling another script...
break | callee.bat
echo Returned from callee...
Run Code Online (Sandbox Code Playgroud)
输出将是这个,虽然没有call
命令.
Run Code Online (Sandbox Code Playgroud)Calling another script... Being called from caller... Returned from callee...
这种行为的原因是什么,导致执行返回给调用者的原因是什么?
当我尝试将多个文件重定向到多个流时,如下例所示,一切都按预期工作:
3< stream3.txt 4< stream4.txt echo/
Run Code Online (Sandbox Code Playgroud)
类似的东西也可以使用更多的流和文件以及其他命令echo/
,甚至是功能代码块.即使使用保留的输出流1
,2
似乎也能正常工作.
但是,只要我按照给定的顺序使用以下流执行此操作:
0< stream0.txt 3< stream3.txt echo/
Run Code Online (Sandbox Code Playgroud)
托管命令提示符实例立即关闭.
当我更改流的顺序时,它再次正常工作:
3< stream3.txt 0< stream0.txt echo/
Run Code Online (Sandbox Code Playgroud)
那么,cmd
当我尝试输入 - 重定向到流0
并3
按此顺序时,为什么实例意外终止?
我使用的是Windows 7(x64).
当我cmd
尝试执行上述失败的输入重定向之前,我打开一个新的命令提示符实例:
cmd
0< stream0.txt 3< stream3.txt echo/
Run Code Online (Sandbox Code Playgroud)
我可以读取出现的错误消息 - 假设文本文件包含其基本名称后跟换行符:
Run Code Online (Sandbox Code Playgroud)'stream3' is not recognised as an internal or external command, operable program or batch file.
当我执行以下操作时,我可以看到两个文件实际上都被重定向:
cmd /V
0< stream0.txt 3< stream3.txt (set /P #="" & echo/!#!)
cmd /V
0< stream0.txt …
Run Code Online (Sandbox Code Playgroud) 我有两个不同的 Spring Batch 项目,它们都配置为元数据表具有相同的数据源(相同的 DB 模式):
application.properties(Spring Batch A)
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
Run Code Online (Sandbox Code Playgroud)application.properties(Spring Batch B)
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/my_batch
Run Code Online (Sandbox Code Playgroud)
在多次成功运行 Spring Batch A 后,我运行了 Spring Batch B 并抛出了一个JobExecutionAlreadyRunningException
.
例子:
org.springframework.batch.core.repository.JobExecutionAlreadyRunningException:此作业的作业执行已在运行:JobInstance: id=2, JobParameters=[{}], Job=[MyBatchName]
在此期间,Spring Batch A 不再运行。异常似乎表明 Job Instance ID 已经被 Spring Batch A 占用,不能被 Spring Batch B 使用。
题:
Spring Batch 元数据模式可以支持多个 Spring Batch 项目吗?
batch-file ×8
cmd ×7
windows ×6
call ×1
datasource ×1
ffmpeg ×1
for-loop ×1
java ×1
pipe ×1
replace ×1
spring ×1
spring-batch ×1
xcopy ×1