powershell start-job问题

我是一个刚刚接触powershell的小白,写了如下代码,就是用于简单的复制:$CDIR="C:\users"$LOG=".\backup.log"if(test-pat... 我是一个刚刚接触powershell的小白,写了如下代码,就是用于简单的复制:
$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后,其中的变量不被展开,网上查了一下,说是要传参什么的也不是很理解,哪位大神可以告知方法?
展开
 我来答
aronwalt
2019-01-05
知道答主
回答量:7
采纳率:100%
帮助的人:4万
展开全部

你好,

先解释你的问题:

其中的【 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为数组。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式