WriteConsole
不適用于 PowerShell ISE。
無論是WriteConsoleW
或WriteConsoleA
做。
例如,請參閱此程式:
#include <iostream>
#include <Windows.h>
void w() {
DWORD written;
BOOL const success = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), L"Printed\n", 8, &written, nullptr);
std::wcout << (success ? L"Success" : L"Failure") << L". Wrote " << written << L" characters." << std::endl;
}
void a() {
DWORD written;
BOOL const success = WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), "Printed\n", 8, &written, nullptr);
std::cout << (success ? "Success" : "Failure") << ". Wrote " << written << " characters." << std::endl;
}
int main() {
w();
a();
return 0;
}
從 PowerShell(或命令提示符或 Git Bash)運行,它列印:
Printed
Success (wrote 8 characters)
Printed
Success (wrote 8 characters)
但是來自 PowerShell ISE:
Failure (wrote 0 characters)
Failure (wrote 0 characters)
uj5u.com熱心網友回復:
這個程式顯示的原因:
#include <iostream>
#include <Windows.h>
int main() {
DWORD const file_type = GetFileType(GetStdHandle(STD_OUTPUT_HANDLE));
if (file_type == FILE_TYPE_CHAR) {
std::cout << "char" << std::endl;
} else if (file_type == FILE_TYPE_PIPE) {
std::cout << "pipe" << std::endl;
} else {
std::cout << file_type << std::endl;
}
return 0;
}
當從 PowerShell(或命令提示符或 Git Bash)運行時,它會列印:
char
但是來自 PowerShell ISE:
pipe
WriteConsole
無法通過管道寫入,因此失敗。如果輸出是通過管道傳輸的,那么從 PowerShell / 命令提示符 / Git Bash 運行時也會發生同樣的事情。
uj5u.com熱心網友回復:
為Bertie Wheen 的有用回答提供背景資訊:
也許令人驚訝的是,Windows PowerShell ISE默認不分配控制臺。(ISE 呈現的類似控制臺的 UI 不是真正的 Windows 控制臺)。
一個控制臺被分配需求,在第一時間控制臺子系統程式在會話中運行(例如
cmd /c ver
)- 然而,即使發生了這種情況,互動式控制臺子系統程式也基本上不受支持(
choice /m "Prompt me"
例如,try )。
- 然而,即使發生了這種情況,互動式控制臺子系統程式也基本上不受支持(
互動方式,你可以測驗是否控制臺已分配或不使用下面的命令:[Console]::WindowTop
; 如果沒有控制臺,您將收到The handle is invalid
錯誤訊息。
從上面可以看出,您的程式不能假設在 ISE 中運行時存在控制臺。
一種選擇是根本不支持在 ISE 中運行,因為它是:
不再積極開發
并有各種理由不使用它(底部),尤其是不能夠運行PowerShell的(核心)6 及局限性相對于控制臺子系統方案如上所述。
至于后續環境:提供最佳 PowerShell 開發體驗的積極開發的跨平臺編輯器是帶有PowerShell 擴展的Visual Studio Code。
至于ISE 中控制臺支持不佳的潛在原因:zett42指出:
ISE 開發人員選擇不分配控制臺的一個可能原因可能源于在應用程式自己的視窗中創建自定義嵌入式控制臺的歷史困難。開發人員不得不求助于駭人聽聞的、不受支持的方式來做到這一點。直到最近(2018 年)Windows 才獲得了專用的偽控制臺 (ConPTY) API。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399956.html