Просмотр исходного кода

规范 PowerShell 文本输出并关闭模块初始化进度流

Samien 1 месяц назад
Родитель
Сommit
47fea792a5
3 измененных файлов с 5 добавлено и 5 удалено
  1. 2 2
      desktop/windows-shell.mjs
  2. 2 2
      desktop/windows.test.mjs
  3. 1 1
      desktop/windows/computer-helper.cpp

+ 2 - 2
desktop/windows-shell.mjs

@@ -2,8 +2,8 @@ import { spawn } from 'node:child_process'
 import { resolve as resolvePath } from 'node:path'
 
 export function powershellArguments(command) {
-  const script = `[Console]::InputEncoding = [Console]::OutputEncoding = $OutputEncoding = New-Object System.Text.UTF8Encoding($false)\n$global:LASTEXITCODE = 0\ntry {\n& {\n${command}\n}\n$ok = $?\nif ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }\nif (-not $ok) { exit 1 }\n} catch { [Console]::Error.WriteLine($_.ToString()); exit 1 }`
-  return ['-NoLogo', '-NoProfile', '-NonInteractive', '-EncodedCommand', Buffer.from(script, 'utf16le').toString('base64')]
+  const script = `$ProgressPreference = 'SilentlyContinue'\n[Console]::InputEncoding = [Console]::OutputEncoding = $OutputEncoding = New-Object System.Text.UTF8Encoding($false)\n$global:LASTEXITCODE = 0\ntry {\n& {\n${command}\n}\n$ok = $?\nif ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }\nif (-not $ok) { exit 1 }\n} catch { [Console]::Error.WriteLine($_.ToString()); exit 1 }`
+  return ['-NoLogo', '-NoProfile', '-NonInteractive', '-OutputFormat', 'Text', '-EncodedCommand', Buffer.from(script, 'utf16le').toString('base64')]
 }
 
 /** Bound both output streams, and terminate the owned process tree before

+ 2 - 2
desktop/windows.test.mjs

@@ -29,8 +29,8 @@ test('Windows credentials use the asynchronous OS provider and reject foreign/co
 })
 test('PowerShell transports quoted Unicode as UTF-16 without shell interpolation', () => {
   const command = 'Write-Output "你好 $env:USERNAME"; exit 7', args = powershellArguments(command)
-  assert.equal(args[3], '-EncodedCommand')
-  const script = Buffer.from(args[4], 'base64').toString('utf16le')
+  assert.equal(args.at(-2), '-EncodedCommand')
+  const script = Buffer.from(args.at(-1), 'base64').toString('utf16le')
   assert.ok(script.includes(command)); assert.match(script, /UTF8Encoding/); assert.match(script, /LASTEXITCODE/)
 })
 test('Windows input invalidates screenshots after DPI, geometry or primary display changes', () => {

+ 1 - 1
desktop/windows/computer-helper.cpp

@@ -82,7 +82,7 @@ static int runShell(const JsonObject& request) {
   wchar_t system[MAX_PATH]{};
   require(GetSystemDirectoryW(system, MAX_PATH), "无法定位 Windows PowerShell");
   auto shell = fs::path(system) / L"WindowsPowerShell" / L"v1.0" / L"powershell.exe";
-  std::wstring command = L"\"" + shell.wstring() + L"\" -NoLogo -NoProfile -NonInteractive -EncodedCommand " + std::wstring(encoded);
+  std::wstring command = L"\"" + shell.wstring() + L"\" -NoLogo -NoProfile -NonInteractive -OutputFormat Text -EncodedCommand " + std::wstring(encoded);
   Handle job(CreateJobObjectW(nullptr, nullptr)); require(job.value != nullptr, "无法创建命令进程组");
   JOBOBJECT_EXTENDED_LIMIT_INFORMATION limits{};
   limits.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;