我正在使用curl将文件上传到云端。问题是,脚本在卷曲操作完成之前立即删除本地文件。奇怪的是,当我将& curl.exe
和Remove-Item
放在一个单独的ps1文件中并在那里进行测试时,它正常工作,并在上传后删除该文件。
以下代码来自main.ps1
(从cmd启动时执行),它每隔5秒检查一次输入文件夹以查找新文件
while ($true) {
Get-ChildItem -Path $inputFolder -Filter "*$extIn" | ForEach-Object {
& ffmpeg.exe -i $inFile ...some operations $outFile
if ($LASTEXITCODE -eq 0) {
#credentials
$lg = ...
#curl upload operation
& curl.exe -T "$outFile" -g -u $lg -k https://mycloud/
Write-Host "Done uploading: $outFile"
#removing item
Remove-Item -LiteralPath $inFile -Force
Write-Host "Removed input file!"
} else {
Write-Error "Conversion failed!"
}
}
sleep 5
}
我使用curl.exe
,因为当我只使用curl
时它给了我一个错误(我不知道这是否相关):
Invoke-WebRequest : Parameter cannot be processed because the parameter name 'T' is ambiguous. Possible matches include ...
在旁注:我在我的另一台在ubuntu 16.04上运行的相同脚本(但使用curl -T ...
)。没有问题。该脚本最终将在ubuntu 16.04 / 17.10上使用,但与此同时它需要在我的Windows PC上运行。
任何一点帮助表示赞赏。
可以尝试
Start-Process <path to exe> -NoNewWindow -Wait
要么
$proc = Start-Process <path to exe> -NoWindow
$proc.WaitForExit()
这些中的任何一个都应该等待该过程完成。您也可以尝试将其添加到行的末尾,调用curl,管道和Wait-Process
| Wait-Process
至于:“我使用了curl.exe,因为当我只使用curl时它给了我一个错误(我不知道这是否相关):”
这是因为在像curl这样的PoSH命令中,wget是PoSH cmdlet的所有别名。您可以使用这些命令,但必须使用PoSH允许的命令。
Get-Alias -Name curl
CommandType Name
Alias curl -> Invoke-WebRequest
(Get-Command -Name Invoke-WebRequest).Parameters
Get-Help -Name Invoke-WebRequest -Examples
Get-Help -Name Invoke-WebRequest -Full
PoSH有很多别名,正如您所发现的,您必须使用.exe来获取真实内容或删除别名。在对外部命令进行任何调用之前,PoSH将始终首先使用本机cmdlet,除非您告诉它。
显示所有别名
Get-Alias
考虑使用PoSH WorkFlow
Windows PowerShell工作流入门https://technet.microsoft.com/en-us/library/jj134242(v=ws.11).aspx
工作流是一系列编程的连接步骤,这些步骤执行长时间运行的任务或需要跨多个设备或受管节点协调多个步骤。 Windows PowerShell工作流允许IT专业人员和开发人员将多设备管理活动序列或工作流内的单个任务编写为工作流。通过设计,工作流可以长时间运行,可重复,频繁,可并行化,可中断,可停止和可重新启动。他们可以被暂停和恢复;它们也可以在意外中断后继续,例如网络中断或计算机重启。
Windows PowerShell:PowerShell脚本与PowerShell工作流https://technet.microsoft.com/en-us/library/dn151046.aspx
PowerShell工作流程:嵌套https://blogs.technet.microsoft.com/heyscriptingguy/2013/01/09/powershell-workflows-nesting