标题说明一切我有一个Start-Job与一个脚本块,而不是执行命令,它输出有关作业的信息。
执行的顺序如下
$location = $(Get-Location).toString()
$oldModulePath = $env:PSModulePath
$env:PSModulePath = $env:PSModulePath + ";" + $location + "LongitudePowershellModules"
$env:PSModulePath
$configXML = [xml](Get-Content $location"InstallationConfig.XML")
$config = $configXML.root
Import-Module CreateComponentsFolder -PassThru
Import-Module CreateTransferFolder -PassThru
Import-Module ConfigureDB -PassThru
Import-Module FastProxyTools -PassThru
Import-Module WspTools -PassThru
Import-Module CopySharepointPowershellXML -PassThru
Import-Module SearchCenterTools -PassThru
Import-Module ConfigureFAST -PassThru
# 1 - CreateComponentsFolder
CreateLongitudeComponentsFolder -currentLocation $location
和带有start-job
的模块function CreateLongitudeComponentsFolder
{
Param(
[Parameter(Mandatory=$True, Position=1)]
[string]$currentLocation
)
$scriptBlock = {Write-Host "Copying files to '"C:Program FilesBa-insightLongitude Fast Component"'"`
Copy-Item $currentLocation"Longitude Fast Component" "C:Program FilesBa-insightLongitude Fast Component" -recurs`
}
Start-Job -ScriptBlock $scriptBlock -ArgumentList $currentLocation -Name "CopyingFiles"
$scriptBlock = {$fileAndFolderList = Get-ChildItem $currentLocation"Longitude Fast Component" -recurs
$targetLocationFileAndFolderList = Get-ChildItem "C:Program FilesBa-insightLongitude Fast Component" -recurs
$timer = new-object System.Timers.Timer
$timer.Interval = 500 #0.5 sec
$timer.AutoReset = $true
$itemsPresent = $fileAndFolderList | Measure-Object
$action = {foreach($item in $fileAndFolderList)`
{`
if($itemsPresent -ne 0)`
{`
if($targetLocationFileAndFolderList.IndexOf($item) -ne -1)`
{`
$itemsPresent = $itemsPresent - 1`
}`
else`
{`
$itemsPresent = $fileAndFolderList | Measure-Object`
}`
}`
else`
{`
$timer.stop()`
}`
}`
}
Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action $action | Out-Null
$timer.Enabled = $true
}
Start-Job -ScriptBlock $scriptBlock -ArgumentList $currentLocation -Name "CheckingFiles"
Wait-Job -Name "CheckingFiles"
Write-Host "All files have been copied."
}
我没有得到任何错误,但它没有执行命令,而是为两个start-jobs
写以下命令HasMoreData : True
StatusMessage :
Location : localhost
Command : Write-Host "Copying files to '"C:Program FilesBa-insightLongitude Fast Component"'"`
Copy-Item $currentLocation"Longitude Fast Component" "C:Program FilesBa-insightLongitud
e Fast Component" -recurs`
JobStateInfo : Running
Finished : System.Threading.ManualResetEvent
InstanceId : 70ab6414-0ca4-467e-b283-20057e4141ad
Id : 1
Name : CopyingFiles
ChildJobs : {Job2}
Output : {}
Error : {}
Progress : {}
Verbose : {}
Debug : {}
Warning : {}
State : Running
这可能与我编写脚本块的方式有关,但我无法找出与我见过的所有其他示例有什么不同。
是否可以使用read-host命令等待用户输入?
EDIT:我发现了为什么作业没有执行的问题。没有正确传递参数。这是我找到解决方案的链接。
传递参数给start-job
最后一个例子可以工作,即使只有一个参数,你也必须这样做。
我还有一个问题。我上面写的东西仍然输出到控制台。是否有任何方法可以抑制start-job cmd中不需要的输出?我认为您需要在脚本块中包含参数,以便您可以使用argumentlist参数将其传递给作业,因为它代表我相信$currentLocation
将在脚本块中为空。
$scriptBlock = {
param([string]$currentLocation)
$source - Join-Path -Path $currentLocation -ChildPath "Longitude Fast Component"
$destination = "C:Program FilesBa-insightLongitude Fast Component"
Write-Host "Copying files to [$destination]"
Copy-Item $source $destination -recurse
}