当修饰符用于for
请求路径元素的可替换参数,for
命令(好吧,一个检索正在读取的变量内容的函数)使用GetFullPathName https://msdn.microsoft.com/en-us/library/windows/desktop/aa364963%28v=vs.85%29.aspx函数将输入字符串调整为可以处理的内容。当请求相对路径时,此 API 函数(以及此 API 调用的一些操作系统基本函数)会生成指示的行为。您可以测试此 C 代码(抱歉,只是一个快速代码测试),使用 ex 调用可执行文件。;:
作为第一个参数。
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>
#define BUFFER_SIZE 4096
int main(int argc, char **argv){
char buffer[BUFFER_SIZE];
DWORD ret;
LPTSTR lpszVariable;
LPTCH lpvEnv;
if (argc != 2) return 1;
if (0 == GetFullPathName( argv[1], BUFFER_SIZE, buffer, NULL )){
printf ("GetFullPathName failed (%d)\n", GetLastError());
return 2;
}
printf("current active directory: %s\r\n", buffer );
if (NULL == (lpvEnv = GetEnvironmentStrings())) {
printf("GetEnvironmentStrings failed (%d)\n", GetLastError());
return 3;
}
lpszVariable = (LPTSTR) lpvEnv;
while (*lpszVariable) {
if (lpszVariable[0]== '=') printf("%s\n", lpszVariable);
lpszVariable += lstrlen(lpszVariable) + 1;
}
FreeEnvironmentStrings(lpvEnv);
return 0;
}
得到类似的东西
D:\>test ;:
current active directory: ;:\
=;:=;:\
=C:=C:\Windows\System32
=D:=D:\
=ExitCode=00000000
EDITED2016/12/23
这是针对 Windows 10 的,但由于 Windows 7 的行为相同,因此它应该共享相同或相似的代码。
环境字符串到控制台的输出由以下命令处理DisplayEnvVariable
功能。在较旧的 Windows 版本中(已检查,XP 是这样做的)此函数调用GetEnvironmentStrings
检索值,但现在(已检查并在 Vista 中已更改)使用指向内存区域的指针。不知何故(抱歉,此时我不能给这个问题更多的时间),它指向环境的未更新副本(在这种情况下,更新的副本不是由cmd
命令,但来自基地Rtl
解析当前驱动路径时调用的函数),生成观察到的行为。
没有必要执行pushd
or cd
命令,对环境的任何更改或任何进程创建都将导致指针更新。
@echo off
setlocal enableextensions disabledelayedexpansion
echo = before ------------------------------
set "
for %%a in ( ";:" ) do rem %%~fa
echo = after -------------------------------
set "
<nul >nul more
echo = after more --------------------------
set "
您可以更换more
用一个简单的线set "thisIsNotSet="
得到相同的结果