PowerShell写入bat文件时$progressPreference被替换为Continue如何解决
问题原因
你现在用的是双引号包裹的PowerShell Here-String(@" "@),这种结构默认会自动解析展开字符串内所有以$开头的PowerShell变量。$progressPreference是PowerShell的内置预设变量,默认值就是Continue,所以在你给$htmlexport赋值的阶段,这个变量就已经被替换成对应值了,不是写入文件的时候才替换的。
解决方法
两种方案任选一种即可:
方案1:改用单引号包裹的Here-String
单引号包裹的Here-String(@' '@)不会解析内部变量,会完全保留字符串原样:
$htmlexport = @' powershell -Command "$progressPreference = 'silentlyContinue'; Invoke-WebRequest https://ftp.ncep.noaa.gov/data/nccf/com/hrrr/prod/hrrr.$m2/conus/hrrr.t$m21z.wrfsfcf00.grib2 -OutFile C:\OpenGrADS-2.2\data\hrrr\hrrr000.grb2" exit '@ $htmlexport | Out-File C:\OpenGrADS-2.2\001-HRRR\HRRR-DOWNLOADGRIBFILES.bat -Encoding UTF8
注意:如果你原来字符串里的$m2、$m21z是需要在PowerShell里提前展开的变量,就不要用这个方案,选方案2
方案2:双引号Here-String下转义$字符
对不需要展开的$符号前加PowerShell转义符反引号(`) 即可阻止变量解析:
$htmlexport = @" powershell -Command "`$progressPreference = 'silentlyContinue'; Invoke-WebRequest https://ftp.ncep.noaa.gov/data/nccf/com/hrrr/prod/hrrr.$m2/conus/hrrr.t$m21z.wrfsfcf00.grib2 -OutFile C:\OpenGrADS-2.2\data\hrrr\hrrr000.grb2" exit "@ $htmlexport | Out-File C:\OpenGrADS-2.2\001-HRRR\HRRR-DOWNLOADGRIBFILES.bat -Encoding UTF8
这种方案下你原来需要展开的$m2、$m21z变量还是会正常解析替换,只有加了反引号转义的$progressPreference会保留原样输出。
内容的提问来源于stack exchange,提问作者Jason Warren
相关产品推荐
相关产品推荐

