powershell start-job问题
$CDIR="C:\users"
$LOG=".\backup.log"
if (test-path $CDIR){
$PAN = read-host "请输入备份目标的路径,使用绝对路径(例:D:\users)"
if ($PAN -match "\:\\"){
start-job -scriptblock {copy $CDIR $PAN -Recurse -Force 2>>$LOG}
}else{
echo "输入的路径格式不对"
}
}else{
echo $CDIR"不存在"
}
其中的【 copy $CDIR $PAN -Recurse -Force 2>>$LOG】我想要它在后台运行,但是使用start-job后,其中的变量不被展开,网上查了一下,说是要传参什么的也不是很理解,哪位大神可以告知方法? 展开
你好,
先解释你的问题:
其中的【 copy $CDIR $PAN -Recurse -Force 2>>$LOG】我想要它在后台运行,但是使用start-job后,其中的变量不被展开,网上查了一下,说是要传参什么的也不是很理解,哪位大神可以告知方法?
答:Powershell的 Start-Job 是Powershell的一个提供多线程任务实现方法的cmdlet , 使用Start-Job相当于又新开了一个Powershel Session,只不过这个Session是在Background运行,没有实际打开的Powershell交互窗口。回到你的问题,比如你在第一个Powershell命令窗口定义了参数 $CDIR="C:\users",你再新开一个Powershell窗口,这个参数不会被初始化,在新窗口输入$CDIR,不会有结果返回。
解决方法:
你可以使用Get-Help Start-Job -detailed 命令查看Start-Job的使用方法和介绍,微软在设计Start-Job这个Cmdlet的时候考虑到了这个问题,所以提供了一个参数 -ArgumentList (注:就算不提供的话,最简单的,你也可以把参数值导出到一个TXT文档,然后在Start-Job的Scriptblock里面使用Get-Content获取你最初Session的值)
去除你的判断语句,提供如下示例代码供你参考(你可以新建D:\Test文件夹,里面放点文件,然后新建D:\TestBK 文件夹作为备份测试文件夹)
$CDIR="D:\Test"
$LOG=".\backup.log"
$Pan = "D:\TestBK"
$job = start-job -ArgumentList $CDIR,$LOG,$Pan -scriptblock {Copy-Item $args[0] -Destination $args[2] -Recurse -Force >> $args[1] }
Wait-Job $job
Receive-Job -Job $job
注: 对于一个ScriptBlock,一个函数或者一个脚本,使用$args 可以返回当前局部定义的所有变量,$args为数组。