PowerShell - 通过Invoke-Command发送变量

问题描述 投票:0回答:1

我有3台Windows 2016服务器和一些我希望自动化的例行任务。我是PowerShell的新手,所以我花了很多时间在StackOverflow和“googling”中寻找答案。

我的任务是通过远程服务器上的7zip备份一些文件。

有一个很好的命令:

Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {start-Process  -wait-FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentList 'a','-t7z','C:\BlueCollar_backup\bluecollar_121.zip','C:\Services\BlueCollar' -wait}

但我需要在bluecollar_121.zip存档名称中添加日期,它应该看起来像bluecollar_13.08.2018.zip

我尝试了大量的变种,但没有运气。

[string]$stime = get-date -f 'dd.MM.yyyy
Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentsList 'a -t7z C:\BlueCollar_backup\bluecollar_'$stime'.zip C:\Services\BlueCollar' -wait}

第二次尝试是:

[string]$stime = get-date -f 'dd.MM.yyyy
[string]$tmp1="C:\BlueCollar_backup\bluecollar_$stime.zip"
$command = {start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentsList 'a -t7z $stime C:\Services\BlueCollar' -wait}

最后一次尝试:

[string]$stime = get-date -f 'dd.MM.yyyy
$arguments = @()
$arguments += "a"
$arguments += "-t7z"
$arguments +=  "$tmp1"
$arguments +=  "C:\Services\BlueCollar"
Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentList($arguments) -wait}

他们都没有工作。问题是$ stime变量。如何将变量$ stime放入Invoke-Command?

UPD1:我解决了这个问题!

Invoke-Command -ComputerName '10.10.0.20' -ArgumentList  $stime -ScriptBlock{
$stime = $args[0]
start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' "a -t7z C:\BlueCollar_backup\bluecollar_$stime.zip C:\Services\BlueCollar" -wait
}
windows powershell server invoke-command scriptblock
1个回答
0
投票

问题是您执行命令的计算机知道$ stime变量,但远程计算机不知道它。所以你必须传递它。

有几个选项,一个是使用$ Using变量

[string]$stime = get-date -f 'dd.MM.yyyy
Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {
    start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentsList "a -t7z C:\BlueCollar_backup\bluecollar_$($Using:stime).zip C:\Services\BlueCollar" -wait
}

另一个可能看起来更清晰的选项是使ScriptBlock成为一串文本,然后将其传递给远程计算机:

$ScriptBlock=[ScriptBlock]::Create("start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentsList 'a -t7z C:\BlueCollar_backup\bluecollar_$stime.zip C:\Services\BlueCollar'")
Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock $ScriptBlock

单引号和双引号之间的重要区别。当您使用单引号时,它会完全按原样解析文本。当您使用双引号时,它会解析变量。

© www.soinside.com 2019 - 2024. All rights reserved.