Batch file 批处理-回显批处理文件中设置的所有变量

Batch file 批处理-回显批处理文件中设置的所有变量,batch-file,cmd,environment-variables,Batch File,Cmd,Environment Variables,假设我有以下代码: @echo off set "var=value" echo %var% 现在我的问题是:如何回显文件中设置的所有变量 我知道你可以做到: set 它将显示所有变量。它显示: ALLUSERSPROFILE=C:\ProgramData APPDATA=C:\Users\foma\AppData\Roaming CommonProgramFiles=C:\Program Files\Common Files CommonProgramFiles(x86)=C:\Progr

假设我有以下代码:

@echo off
set "var=value"
echo %var%
现在我的问题是:如何回显文件中设置的所有变量

我知道你可以做到:

set
它将显示所有变量。它显示:

ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\foma\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
...
var=value
我希望它显示:

ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\foma\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
...
var=value
我知道我可以执行
设置var
来显示以
var
开头的所有变量,但在我的情况下,所有变量都是从另一个批处理文件“导入”的,所以我不知道变量名是如何开始的。 有什么想法吗

@echo off
setlocal
set>originalfile.txt
...
:: list environment changes
set|findstr /x /L /g:originalfile.txt

应该可以工作-快照起始值,然后
findstr
行应该显示所做的所有更改(删除除外)-至少在理论上,这只是一个动态建议。

这将原始
cmd
环境(保存到文件)与当前环境进行比较。如果需要其他检查,可以更改文件创建

@echo关闭
setlocal enableextensions disabledelayedexpansion
rem我们需要一个临时文件来存储原始环境
对于%%f in(“%temp%\original\u%random%%random%%random%%random%.tmp”)执行以下操作(
rem将原始环境检索到临时文件
启动/i/wait/min”“%comspec%”/c“>”“%%~ff”集
rem我们需要两个标志变量。准备两个“应该”不冲突的名称
对于/f“代币=1,2”%%d in(“\&d&%random%%random%\\&m&%random%%random%\”)do(
rem%%d将用于确定是否检查变量删除
第一次内传球时的雷姆
rem%%e将用于匹配现有/原始变量之间的变量
设置“%%d=”
rem检索当前环境内容
对于/f“delims=eol=”%%a in('set')do(
我们没有找到匹配的变量
设置“%%e=”
rem在原始变量集中搜索匹配项
对于/f“usebackq delims=eol=”%%o in(“%%~ff”)do(
rem如果变量匹配,则标记它,否则检查变量
rem删除是对原始文件的第一次循环
如果%%a==%o(设置为“%%e=1”),如果未定义,则为%%d(
对于(“%%~o”)中的/f“delims==”%%V,如果未定义%%V,则执行此操作(回显(%%V=)
)
)
rem如果未找到匹配项,则输出更改的值
如果未定义%%e(回音(%%a)
rem现在已检查所有变量删除。
)如果未定义%%d,则设置“%%d=1”
rem清除标志变量
)&set“%%d=”&set“%%e=”
rem清理临时文件
)&del“%%~ff”
当我们删除注释后,代码就没有看起来那么多了

@echo关闭
setlocal enableextensions disabledelayedexpansion
对于%%f in(“%temp%\original\u%random%%random%%random%%random%.tmp”)执行以下操作(
启动/i/wait/min”“%comspec%”/c“>”“%%~ff”集
对于/f“代币=1,2”%%d in(“\&d&%random%%random%\\&m&%random%%random%\”)do(
设置“%%d=”
对于/f“delims=eol=”%%a in('set')do(
设置“%%e=”
对于/f“usebackq delims=eol=”%%o in(“%%~ff”)do(
如果%%a==%o(设置为“%%e=1”),如果未定义,则为%%d(
对于(“%%~o”)中的/f“delims==”%%V,如果未定义%%V,则执行此操作(回显(%%V=)
)
)
如果未定义%%e(回音(%%a)
)如果未定义%%d,则设置“%%d=1”
)&set“%%d=”&set“%%e=”
)&del“%%~ff”
编辑只是为了完成。dbenham指出,前面的代码无法处理名称或值中包含换行符的变量。这是一个混合批处理文件(另存为ex.
checkEnvironment.cmd
文件),可以处理这种情况

@if(@This==@IsBatch)@then/*批处理区域------------------------------------
@回音
setlocal enableextensions disabledelayedexpansion
调用:processCurrentEnvironment“%~f1”
后藤:eof
:processCurrentEnvironment
调用“%systemroot%\system32\cscript.exe”//nologo//e:JScript“%~f0”/saved:“%1”
后藤:eof
*/@end
//Javascript区域-----------------------------------------------------------
var-environment=WScript.CreateObject('WScript.Shell').environment('PROCESS');
var savedFileName=WScript.Arguments.Named.Item('saved');
如果(!savedFileName){
//如果不存在保存的文件名,则输出当前环境
for(var e=新枚举数(环境);!e.atEnd();e.moveNext()){
Write(例如item()+'\0\r\n');
};
}否则{
//检索保存的环境以与当前环境进行比较
var savedEnvironment=retrieveSavedEnvironment(savedFileName);
//对于当前环境中的每个元素
for(var e=新枚举数(环境);!e.atEnd();e.moveNext()){
//检索变量的{variable:,value:}表示形式
var buffer=splitEnvironmentVariable(例如item());
if(缓冲区){
//如果保存的版本中不存在当前变量
//或者如果当前值与上一个值不匹配
//然后转储当前变量
如果(
!savedEnvironment[buffer.variable]
||savedEnvironment[buffer.variable].value!==buffer.value
)输出变量(缓冲区);
//在任何情况下,这都是一个已处理的变量
删除savedEnvironment[buffer.variable];
}
};
//任何保存的变量仍然存在都是已删除的变量,请显示它们
for(savedEnvironment中的var e)outputVariable(e);
};
//-辅助函数----------------------------------------------------------
//处理保存文件的内容以生成{{变量:,值:},…}
//已保存环境的表示形式
func