小编asc*_*pfl的帖子

批处理文件:防止 for /f 循环中的字面解释

目前,我有一个循环遍历项目列表并将它们复制到目录(存档)。但是,列表中的一项(路径名中有一个全局变量)被“字面”解释(作为文本而不是代码)。我知道通常你可以通过 (^^) 转义该行,将其解释为代码而不是文本,但显然我在这里做错了什么,因为它不起作用......

my.list 中存在问题的项目(其中包含转义符)是:

location\foo^^%date:~0,3%*.zip
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码是...

for /f "delims=" %%a in (my.list) do (
    echo "%%a"
)
Run Code Online (Sandbox Code Playgroud)

回声的

"location\foo^^%date:~0,3%*.zip"
Run Code Online (Sandbox Code Playgroud)

代替

location\fooMON*.zip
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

windows for-loop cmd escaping batch-file

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

%errorlevel% 在 Windows XP 中不起作用。但它适用于Windows7

%errorlevel% 在 WindowsXP 中不起作用。

据我所知,当发生错误时,%errorlevel% 设置为 1 或更高的值,如果没有错误,它将设置为 0。

但是,即使没有错误,%errorlevel% 也是 1。我设置 %errorlevel% 0,即使有错误 %errorlevel% 也是 0。

我认为操作系统不会改变 XP 中的 %errorlevel%。

在 Win7 中它完全可以工作。

@echo off

setlocal enabledelayedexpansion

call dir
echo errorlevel=%errorlevel%
REM expected errorlevel=0 but 1

call dor
echo errorlevel=%errorlevel%
REM expected errorlevel=1

set errorlevel=0
call dor
echo errorlevel=%errorlevel%
REM expected errorlevel=1 but 0
Run Code Online (Sandbox Code Playgroud)

但是如果 errorlevel 1() 看起来有效。

windows cmd batch-file errorlevel

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

如何在Windows批处理文件中提取版本号?

我需要从字符串中提取Major,Minor和Revision数字并实现这一点我试图使用'.'在批处理文件中拆分字符串.字符作为分隔符.

例如:如果用户在命令提示符下输入1.0.2,我应该能够提取

  • 1 - 主要版本,
  • 0 - 次要版本和
  • 2 - 修订

我正在尝试使用FOR命令来实现这一点,但只是没有通过.任何人都可以帮助我解决部分

@ECHO OFF & SETLOCAL 
set /p "ReleaseVersion=Please specify the software release version : "

:nextVar
for /F "tokens=1* delims=." %%a in ("%ReleaseVersion%") do (
   set %%a
   set ReleaseVersion=%%b
)
if defined ReleaseVersion goto nextVar

@PAUSE
Run Code Online (Sandbox Code Playgroud)

windows command-line cmd batch-file

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

批量跳过WMIC命令输出的最后一个空行

我正在尝试以 JSON 格式格式化命令的输出:

echo "patches" : {
set patches="wmic qfe get HotfixID"
for /f "skip=1" %%i in (' %patches% ') do (
    set /a count=count+1
    call echo "!count!" : "%%i",
)
echo }
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到我到达补丁列表的末尾,它读取最后一个补丁之后的行,然后打印"".

我怎样才能让它在应该停止的时候停止?

如果可能,我想避免使用文本文件。

cmd batch-file output

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

获取WMIC命令的结果并将其存储在变量中

我看到一些批处理脚本以这种方式工作,包括所有的stackoverflow.

我的问题很简单:为什么MEM部分不起作用?

@echo OFF

SET CPU="$CPU"

echo CPU: %NUMBER_OF_PROCESSORS%

FOR /F "delims=" %%i IN ('wmic computersystem get TotalPhysicalMemory') DO set MEM=%%i

echo MEM: %MEM%
Run Code Online (Sandbox Code Playgroud)

scripting batch-file wmic

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

使用 BAT 文件时出错。——此时R出乎意料

这是代码:

call n:\xxx\xxx\variables.bat %1 %2 %3 %4 %5 %6

set yourZipPassword=%xxx%
set yourFolderPath="n:\xxxx\xxxx\%xxxx%"

for /R "%yourFolderPath%" %%I in ("*.zip") do (
  "C:\Program Files\7-Zip\7z.exe" x -p%yourZipPassword% -y -o"%%~dpI" "%%~fI" 
)
Run Code Online (Sandbox Code Playgroud)

不知道如何处理这个错误 - “ R 此时出乎意料。

这个bat文件停留在这一行并且不再处理:

for /R "%yourFolderPath%" %%I in ("*.zip") do (
Run Code Online (Sandbox Code Playgroud)

cmd batch-file

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

在每个字符后插入新行[batch-file]

我正在尝试创建批处理文件脚本以将普通.txt文档转换为完全垂直的文档.例如:

从:

This is a test document,
it is displaying characters on the same line.
Run Code Online (Sandbox Code Playgroud)

至:

T
h
i
s

i
s

a

t
e
s
t

d
o
c
u
m
e
n
t
,

i
t

i
s

d
i
s
p
l
a
y
i
n
g

c
h
a
r
c
t
e
r
s

o
n

t
h
e

s
a
m
e

l
i
n
e
.
Run Code Online (Sandbox Code Playgroud)

text batch-file

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

在"命令存在"中回显是否总是需要在Windows命令提示符下使用双引号?

我试图找到一个文件的存在,然后在命令提示符下打印出如下目录:

C:\> if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (echo C:\Program Files(x86)\Microsoft Visual Studio 14.0\)
Run Code Online (Sandbox Code Playgroud)

这失败并出现以下错误:

\Microsoft was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

如果我重写我的命令

C:\> if exist "C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" (echo "C:\Program Files(x86)\Microsoft Visual Studio 14.0\")
Run Code Online (Sandbox Code Playgroud)

这打印:

"C:\Program Files(x86)\Microsoft Visual Studio 14.0\"
Run Code Online (Sandbox Code Playgroud)

我使用了这个命令的输出,并且它周围的引号引起了一些问题.有什么办法可以在不添加引号的情况下回应这个问题吗?

quotes cmd batch-file

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

格式为 xxxx.xxxx.xxxx 的 MAC 的批量正则表达式

我一直在尝试解析格式为“xxxx[Delimiter]xxxx[Delimiter]xxxx”的mac,其中“x”在[0-9,AF,af]中,“[Delimiter]”在[:,.,- ]。我已尝试以下代码,并引用标题为Regex 的示例来匹配批处理脚本中的变量以及什么是 MAC 地址的正则表达式?

set MACAddr=012a.23fa.5ffc
If [%MACAddr%] EQU [] (
echo MAC Address is not set. Please set it to proceed.
) else (
echo %MACAddr%|findstr /r "^([0-9A-Fa-f]{2}[:.-]?){5}([0-9A-Fa-f]{2})$"
if errorlevel 1 (echo Mac %MACAddr% is not of same Format as xxxx.xxxx.xxxx) else ( pause )
)
Run Code Online (Sandbox Code Playgroud)

也尝试过这个

echo %MACAddr%|findstr /r "^([0-9A-Fa-f]{4})([:.-])([0-9A-Fa-f]{4})([:.-])([0-9A-Fa-f]{4})$"
Run Code Online (Sandbox Code Playgroud)

但它只能运行if errorlevel 1 (echo Mac %MACAddr% is not of same Format as xxxx.xxxx.xxxx)。请告诉我我做错了什么。

windows cmd batch-file findstr

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

批处理文件:转义!在For Loop中

我正在尝试创建一个for循环,它将通过一个目录并对该目录中的所有文件运行ffmpeg命令.我的问题是,某些文件!的名称在使用延迟扩展时会导致问题.我研究了很多解决方案,但没有一个能让我到任何地方.目前我可以用!包含的方式回显文件名,但我似乎无法通过!my for循环传递文件名,因为延迟扩展有效地删除了!.

这是我的批处理脚本:

@echo off
setlocal enabledelayedexpansion
for %%f in ("Y:\Samples\Test Videos\*.mkv") do (
    set "filename=%%~nxf"
    ffmpeg -i "%%f" -vcodec copy -acodec copy -scodec copy -vbsf h264_changesps=level=40 -vbsf h264_changesps=fps=24000:1001 "E:\Converted\!filename!"
)
pause
Run Code Online (Sandbox Code Playgroud)

这适用于没有!名称的所有文件.如果我使用这样的批处理脚本:

@echo off
for %%f in ("Y:\Samples\Test Videos\*.mkv") do (
   call :command "%%f"
)
pause

:command
set "fname=%~nx1"
set "fpath=%~dpnx1"
echo %fname%
ffmpeg -i %fpath% -vcodec copy -acodec copy -scodec copy -vbsf h264_changesps=level=40 -vbsf h264_changesps=fps=24000:1001 "E:\Converted\%fname%"
Run Code Online (Sandbox Code Playgroud)

然后我可以使用! …

for-loop cmd escaping batch-file

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