Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String 如何对for循环中的变量执行字符串操作?_String_Batch File_Command Line - Fatal编程技术网

String 如何对for循环中的变量执行字符串操作?

String 如何对for循环中的变量执行字符串操作?,string,batch-file,command-line,String,Batch File,Command Line,这听起来很愚蠢,但我无法让它工作。我想我只是不明白%%v、%v%和%v 以下是我想做的: for %%v in (*.flv) do ffmpeg.exe -i "%%v" -y -f mjpeg -ss 0.001 -vframes 1 -an "%%v.jpg" 这将成功为每个电影生成缩略图,但问题是: movie.flv -> movie.flv.jpg 因此,我想做的是从%%v中提取最后4个字符,并将其用于第二个变量 我一直在尝试这样的事情: %%v:~0,-3% 但它不起作

这听起来很愚蠢,但我无法让它工作。我想我只是不明白
%%v、%v%和%v

以下是我想做的:

for %%v in (*.flv) do ffmpeg.exe -i "%%v" -y -f mjpeg -ss 0.001 -vframes 1 -an "%%v.jpg"
这将成功为每个电影生成缩略图,但问题是:

movie.flv -> movie.flv.jpg
因此,我想做的是从
%%v
中提取最后4个字符,并将其用于第二个变量

我一直在尝试这样的事情:

%%v:~0,-3%
但它不起作用,我所能想到的任何迭代也不起作用


有什么想法吗?

使用%%~nV仅获取文件名

for %%v in (*.flv) do ffmpeg.exe -i "%%v" -y -f mjpeg -ss 0.001 -vframes 1 -an "%%~nv.jpg"
从“帮助”:


我在批处理方面不如上述(我使用WSH或其他脚本语言),但我可以尝试解释%%v%v和%v%

前两种形式在
for
循环中使用
help for
解释了区别,第一个表单用于批处理文件,而第二个表单用于直接在命令提示符下键入(粘贴)命令

最后一种形式只是将变量名(环境变量)替换为其值:

set FOO=C:\bar\foo
cd %FOO%\gah

对于发现此线程的人员,请查看如何实际对For循环变量执行字符串操作(使用):


我更喜欢的另一种方法是为for循环中的每个元素创建一个子例程(:processMpeg),我将%%v变量传递给该子例程

for %%v in (*.flv) do call :processMpeg "%%v"
goto :eof

:processMpeg
  set fileName=%~n1
  echo P1=%1  fileName=%fileName%  fullpath=%~dpnx1
  ffmpeg.exe -i "%~1" -y -f mjpeg -ss 0.001 -vframes 1 -an "%filename%.jpg"
  goto :eof

请参阅“帮助”:此外,变量引用的替换功能得到了增强。您现在可以使用以下可选语法:%~I-展开%I删除任何周围的引号(“)…%~nI-只将%I展开为文件名…如果要比较而不是回显,您不能在替换的同一行上进行比较,您需要再次使用SET,例如(检查文件是否包含“第三方”)“脚本”:设置文件=%%i\n设置文件=!文件:第三方=\n如果%%f==!文件如果循环的“set”和“echo”在一行中:nslookup-vc-type=TXT twitter.com 8.8.8 | find“”| FOR/F”标记=*%F in('findstr$')do@(echo | set/P str=%F)
setlocal enabledelayedexpansion

...

::Replace "12345" with "abcde"
for %%i in (*.txt) do (
    set temp=%%i
    echo !temp:12345=abcde!
)
for %%v in (*.flv) do call :processMpeg "%%v"
goto :eof

:processMpeg
  set fileName=%~n1
  echo P1=%1  fileName=%fileName%  fullpath=%~dpnx1
  ffmpeg.exe -i "%~1" -y -f mjpeg -ss 0.001 -vframes 1 -an "%filename%.jpg"
  goto :eof