我注意到在大多数脚本中,两者通常在同一行中:
SETLOCAL ENABLEDELAYEDEXPANSION
Run Code Online (Sandbox Code Playgroud)
这两个实际上是单独的命令,可以写在不同的行上吗?
ENABLEDELAYEDEXPANSION如果脚本设置在脚本的第一行并且在脚本结束之前未禁用,那么设置是否会对脚本产生负面影响?
我知道如何在预定义变量时执行此操作.但是,当要求用户输入某种输入时,如何修剪前导和尾随空格?这是我到目前为止:
@echo off
set /p input=:
echo. The input is %input% before
::trim left whitespace
for /f "tokens=* delims= " %%a in ("%input%") do set input=%%a
::trim right whitespace (up to 100 spaces at the end)
for /l %%a in (1,1,100) do if "!input:~-1!"==" " set input=!input:~0,-1!
echo. The input is %input% after
pause
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种使用Windows批处理文件的方法,该文件调用子批处理文件,该文件传递1-9个参数并返回值(字符串),而无需将返回值保存到文件/ etc中.返回值我保存到变量中,就像在@FOR/F中一样
我看着
@FOR /F "tokens=*" %%i IN ('%find_OS_version%') DO SET OS_VER=%%i
Run Code Online (Sandbox Code Playgroud)
和
Call function/batch %arg1% %arg2%
Run Code Online (Sandbox Code Playgroud)
我没有看到我如何设置这样做
编辑:dbenham有点回答我的问题.他的例子是批处理文件主要部分和功能之间.我的问题是两个不同的批处理文件.基础dbenham回答这是以下布局.
主批文件
CALL sub_batch_file.bat return_here "Second parameter input"
REM echo is Second parameter input
ECHO %return_here%
REM End of main-batch file
Run Code Online (Sandbox Code Playgroud)
sub_batch_file.bat
@ECHO OFF
SETLOCAL
REM ~ removes the " "
SET input=%~2
(
ENDLOCAL
SET %1=%input%
)
exit /b
REM End of sub-batch file
Run Code Online (Sandbox Code Playgroud) 我想在批处理脚本中做这样的事情.如果这是正确或可能的方式或任何其他方式,请告诉我?
set var1=A
set var2=B
set AB=hi
set newvar=%var1%%var2%
echo %newvar%
Run Code Online (Sandbox Code Playgroud)
这应该产生值"hi".
我刚检查了stackoverflow,它似乎非常有用,并且在Windows XP上运行良好.但是使用Windows 7它并不适用于某些不明原因.
该PATH变量看起来是这样的
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\QuickTime\QTSystem\
Run Code Online (Sandbox Code Playgroud)
它显然包含\以及我用于分割包含此FOR循环的批处理的分号:
FOR /F "delims=;" %%A IN ("%PATH%") DO (
echo %%A
)
Run Code Online (Sandbox Code Playgroud)
执行不会导致任何错误,但它只提供一个(第一个)令牌
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
Run Code Online (Sandbox Code Playgroud)
我不知道为什么FOR会终止并玩弄网上建议的几个变种但没有完成这项工作.
任何帮助将受到高度赞赏.
基督教
因此,对于我当前困境的第二部分,我有一个文件夹列表c:\file_list.txt.我需要能够根据行号提取它们(好吧,用一些mod回显它们),因为这个批处理脚本是由迭代宏进程调用的.我将行号作为参数传递.
@echo off
setlocal enabledelayedexpansion
set /a counter=0
set /a %%a = ""
for /f "usebackq delims=" %%a in (c:\file_list.txt) do (
if "!counter!"=="%1" goto :printme & set /a counter+=1
)
:printme
echo %%a
Run Code Online (Sandbox Code Playgroud)
这给了我一个输出%a.卫生署!所以,我试过回声!a!(结果 :) ECHO is off.; 我试过回声%a(结果:a)
我认为很容易做的就是修改head.bat这里找到的代码:
Windows批处理命令从文本文件读取第一行,
而不是回显每一行 - 我只是回显最后一行找到的.并不像人们想象的那么简单.我注意到我的柜台由于某种原因停留在零; 我想知道这是否set /a counter+=1正在做我认为它正在做的事情.
我试图使用setlocal enabledelayedexpansion,并cd在一个批处理脚本,这似乎不会持续变回壳一起.
我需要的原因setlocal enabledelayedexpansion是我需要在脚本运行时动态扩展脚本中的变量.
考虑以下示例批处理文件:
a.bat
================================
setlocal enabledelayedexpansion
cd ..
Run Code Online (Sandbox Code Playgroud)
上述批处理文件未按预期迁移到上一个目录!
检查一下.
我已成功使用CALL机制允许一个批处理文件调用另一个批处理文件来设置环境变量.这段代码在Windows XP上运行了一年多.
但是,它在Windows 7上似乎没有以相同的方式工作.变量存在于EXIT/B语句之前的第二个批处理文件中.但是,它们在返回第一批文件时不存在.
一些简单的例子似乎按预期工作,但大批量脚本没有.
有没有人遇到过这方面的困难或知道任何变通方法?
试图在变量中保留感叹号.以下是简化的说明性脚本:
echo off
set testvar="C:\Windows\TestOfIllegals[!]"
echo Pre-EnableDE: %testvar%
setlocal enableextensions enabledelayedexpansion
echo Post-EnableDE: %testvar%
Setlocal DisableDelayedExpansion
echo ssetlocal sub-instance...
echo TestVar after re-disableDE: %testvar%
set modTestVar=%testvar%
echo TestVar to new var, modTestVar: %modTestVar%
endlocal & set "RetVar2=%modTestVar%"
echo modTestVar back in main script: %RetVar2%
Setlocal DisableDelayedExpansion
echo modTestVar, main script in another setlocal diasbleDE instance: %RetVar2%
endlocal
pause
exit /b
Run Code Online (Sandbox Code Playgroud)
这会产生输出:
Pre-EnableDE: "C:\Windows\TestOfIllegals[!]"
Post-EnableDE: "C:\Windows\TestOfIllegals[]"
ssetlocal sub-instance...
TestVar after re-disableDE: "C:\Windows\TestOfIllegals[!]"
TestVar to new var, modTestVar: "C:\Windows\TestOfIllegals[!]"
modTestVar back in …Run Code Online (Sandbox Code Playgroud) 可能重复:
使环境变量生存ENDLOCAL 如何将变量
的值保留在使用"延迟扩展本地"模式的Windows批处理脚本之外?
我有一个批处理文件,如下所示:
REM I need to use SETLOCAL so as not to pollute the environment
REM with any variables used to implement the logic in this script
SETLOCAL
SET I_DONT_WANT_THIS_VARIABLE_TO_LEAK_OUTSIDE=c:\
REM BUT, there is this one change to the environment I want to make sticky:
PATH %PATH%;%I_DONT_WANT_THIS_VARIABLE_TO_LEAK_OUTSIDE%
Run Code Online (Sandbox Code Playgroud)
该脚本用于SETLOCAL将环境与批处理文件想要执行的任何操作隔离开来,但这会导致一个问题:最后我确实希望以某种非常具体的方式修改调用者的环境,但是会SETLOCAL阻止这种情况(更改将立即撤消)批处理文件退出).ENDLOCAL在设置路径之前我也无法调用,因为它将环境恢复到其原始状态,消除了变量的值,因此我无法将其值附加到路径.
有没有办法设置路径而忽略SETLOCAL有效?或者,是否有任何技巧可以明确地保持变量的值在调用时被消除ENDLOCAL?
我知道可以使用临时文件作为可以绕过ENDLOCAL屏障的容器,但是欢迎更优雅的解决方案.
我希望将视频编解码器作为变量存储在批处理文件中以自动进行一些视频转换,但不想转换已经是正确编解码器的内容。
这将成功生成编解码器(hevc)
C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries` stream=codec_name -of default=noprint_wrappers=1:nokey=1 video.mkv
pause
Run Code Online (Sandbox Code Playgroud)
但是我一直无法将该结果存储在变量中,我已经遵循了许多建议这种布局的示例。
for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 video.mkv') do set "codec=%%I"
echo %codec%
Run Code Online (Sandbox Code Playgroud)
但是这会导致此错误:“参数 'noprint_wrappers' 作为输入文件名提供,但 'codec_name' 已指定。”
我真的不知道该去哪里,因为我所有的阅读都表明这是存储变量的正确方法。
我想创建一个实用程序批处理文件,该文件将由客户端批处理文件使用。实用程序批处理文件将创建结果并将重定向为输出。客户端批处理文件将调用 utility.bat 并将结果保存在变量中。
我编写的Utility.bat代码如下
echo off
set result="some info"
echo %result%
rem output
Run Code Online (Sandbox Code Playgroud)
我不确定如何将结果作为输出传递的语法
client.batch的代码如下
@echo off
set var1=%Utility.bat%
echo "%var1%"
Run Code Online (Sandbox Code Playgroud)
需要语法帮助才能将结果作为输出传递。
我在网上找到了许多将结果传递到文本文件(日志记录)的答案,但这不是我的要求。
batch-file ×12
cmd ×4
windows ×4
ffprobe ×1
for-loop ×1
input ×1
path ×1
trim ×1
whitespace ×1
windows-7 ×1