You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Deno脚本在不同目录执行时stdout返回结果不同?

Deno调用PowerShell执行ls无输出的原因分析

问题代码

import * as path from "https://deno.land/std@0.188.0/path/mod.ts";
async function getStdout() {
    const dirname = path.dirname(path.fromFileUrl(import.meta.url))
    const cmd = new Deno.Command("pwsh", { args: ['-c', 'ls', dirname] });
    const { _code, stdout, _stderr } = await cmd.output();
    const decodedStdout = new TextDecoder().decode(stdout)
    console.log(decodedStdout)
}
await getStdout()

问题现象

该脚本在目录A中运行正常,但在目录B中执行时无输出(目录B下存在文件,直接在该目录执行ls可正常显示内容);将ls替换为echo后,在目录B中能正常输出结果。

根本原因

问题出在PowerShell -c参数的参数传递逻辑:

  • PowerShell的-c(-Command)参数仅接受单个字符串作为要执行的命令内容。
  • 代码将ls和dirname拆成独立参数传给pwsh,此时PowerShell仅会把第一个参数ls当作-c的命令执行,后面的dirname会被当作PowerShell进程的位置参数($args[0]),但ls命令并没有使用这个参数。
  • 目录A恰好是Deno的当前工作目录,所以ls默认列出当前目录内容,有输出;而目录B不是当前工作目录,ls列出的是Deno运行时的当前工作目录(而非脚本所在的dirname),若该目录为空就会无输出。
  • 换成echo时,echo默认会输出所有位置参数,所以dirname被打印,看起来正常,但这是参数传递错误导致的巧合。

修复方案

方案1:将命令拼接为单个字符串

const cmd = new Deno.Command("pwsh", { args: ['-c', `ls "${dirname}"`] });

注意:路径含空格时需用引号包裹,避免解析错误。

方案2:利用PowerShell的位置参数传递

const cmd = new Deno.Command("pwsh", { 
  args: ['-c', 'ls $args[0]', dirname] 
});

这种方式更安全,无需手动处理路径中的特殊字符。

内容的提问来源于stack exchange,提问作者Ooker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:23:35