我想运行一个即使关闭终端窗口也将继续执行的脚本。
我在PowerShell 2.0上使用以下命令从Internet下载文件:
$fyle = New-Object System.Net.WebClient;
$fyle.DownloadFile($url, $dest);
下面的脚本下载并运行一个.ps1脚本,我可以关闭窗口,但不能立即关闭,因为我必须等待文件下载。
$fyle = New-Object System.Net.WebClient;
$fyle.DownloadFile($url, $dest_filename);
Start-Process cmd -ArgumentList " /c start /min powershell -Exec Bypass $dest_filename" -NoNewWindow
要解决此问题,我所做的只是将$fyle
放在Start-Process
块中:
$url = "https://google.com";
$dir = "$env:userprofile/adir";
$dest_filename = "$dir/script.ps1";
Start-Process cmd -ArgumentList " /c start powershell -Exec Bypass mkdir $dir; $fyle=New-Object System.Net.WebClient; $fyl.DownloadFile($url,$dest_filename); $dest_filename"
但是,出现此错误:
The term '=New-Object' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:40 + mkdir C:\Users\IEUser/adir; =New-Object <<<< System.Net.WebClient; .DownloadFile(https://google.com,C:\Users\IEUser/adir/script.ps1); C:\Users\IEUser/adir/script.ps1 + CategoryInfo : ObjectNotFound: (=New-Object:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
答案 0 :(得分:0)
抛开代码中的错别字,如果您仔细看看引发错误的语句,就会很明显地看到发生了什么:
+ mkdir C:\Users\IEUser/adir; =New-Object <<<< System.Net.WebClient; .DownloadFile(https://google.com,C:\Users\IEUser/adir/script.ps1); C:\Users\IEUser/adir/script.ps1 ^^ ^^
您要使用的变量在我上面指出的位置缺失。没有变量,语句将成为不完整的命令,从而引发您观察到的错误。
这样做的原因是要在双引号字符串中传递CMD的参数。 PowerShell的解析器在将字符串传递到Start-Process
之前,在该字符串 中扩展 all 个变量。未定义的变量将扩展为空字符串,从而使您无法执行完整的命令行。变量扩展还会导致您的代码出现另一个问题,因为用作字符串DownloadFile()
的变量也是 扩展了 ,然后将字符串传递给{ {1}}。但是,Start-Process
期望 strings 不是裸词作为其参数。
您可以通过以下方法解决此问题:将DownloadFile()
转义到变量内部中定义的变量中,并为$
的参数加上引号:
DownloadFile()
更好的方法是,将参数列表定义为数组,然后再将其传递给Start-Process cmd -ArgumentList " /c start powershell -Exec Bypass mkdir $dir; `$fyle=New-Object System.Net.WebClient; `$fyle.DownloadFile('$url','$dest_filename'); $dest_filename"
# ^ ^ ^ ^ ^ ^
:
Start-Process