簡體   English   中英

cmd.exe命令行環境變量解析

[英]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%

因此,根據我的收集,這些是轉義規則:

對於C運行時/ CommandLineToArgvW令牌化

  1. 替換\\"\\\\"
  2. 替換"\\"
  3. 用雙引號將結果引起來。

對於cmd.exe解析

  • 轉義字符<>| ^^SPACE,方法是添加轉義字符^
  • 如果應用了C運行時轉義規則,並且cmd.exe僅將參數傳遞給另一個程序,則不必轉義空格。

這些轉換應按順序應用,首先是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM