[英]cmd.exe Command Line Parsing of Environment Variables
我不知道如何讓cmd.exe不能將%PATH%
類的內容解釋為環境變量。 鑒於此程序:
#include<stdio.h>
#include<windows.h>
int main(int argc, char *argv[])
{
int i;
printf("cmd line: %s\n", GetCommandLine());
for (i = 0; i < argc; i++) {
printf("%d: %s\n", i, argv[i]);
}
return 0;
}
根據參數的位置,我有這些不同的輸出:
>args "k\" o" "^%PATH^%"
cmd line: args "k\" o" "%PATH%"
0: args
1: k" o
2: %PATH%
>args "^%PATH^%" "k\" o"
cmd line: args "^%PATH^%" "k\" o"
0: args
1: ^%PATH^%
2: k" o
我猜這是因為cmd.exe無法識別轉義的\\"
並且將轉義的雙引號視為關閉了第一個引號,而在第一種情況下未引用%PATH%
。我之所以這樣說是因為,如果我不引述該參數,它總是有效的:
>args ^%PATH^% "k\" o"
cmd line: args %PATH% "k\" o"
0: args
1: %PATH%
2: k" o
但那時我不能有空格...
顯然也可以通過將引號轉義來實現:
>args ^"oo \\\^" \^" ^%PATH^%^"
cmd line: args "oo \\\" \" %PATH%"
0: args
1: oo \" " %PATH%
因此,根據我的收集,這些是轉義規則:
CommandLineToArgvW
令牌化 \\"
→ \\\\"
"
→ \\"
這些轉換應按順序應用,首先是C運行時規則,然后是cmd.exe規則。
如果編寫要由cmd.exe直接解釋的內容,則僅應應用cmd.exe規則;否則,請執行以下操作: 如果以不涉及cmd.exe的方式啟動程序,則僅應應用C運行時規則。
這是一個由cmd.exe直接解釋的參數的示例,該參數寫入名為oo %PATH%
的文件:
echo test > oo^ ^%PATH^%
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.