PowerShell - 通过 Invoke-Command 发送变量



我有 3 台 Windows 2016 服务器和一些我想自动化的例行任务。 我是PowerShell的新手,所以我花了很多时间在StackOverflow和"谷歌搜索"中寻找答案。

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

有一个命令效果很好:

Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {start-Process  -wait-FilePath 'C:Program Files7-Zip7z.exe' -ArgumentList 'a','-t7z','C:BlueCollar_backupbluecollar_121.zip','C:ServicesBlueCollar' -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 Files7-Zip7z.exe' -ArgumentsList 'a -t7z C:BlueCollar_backupbluecollar_'$stime'.zip C:ServicesBlueCollar' -wait}

第二次尝试是:

[string]$stime = get-date -f 'dd.MM.yyyy
[string]$tmp1="C:BlueCollar_backupbluecollar_$stime.zip"
$command = {start-Process -FilePath 'C:Program Files7-Zip7z.exe' -ArgumentsList 'a -t7z $stime C:ServicesBlueCollar' -wait}

最后一次尝试:

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

它们都不起作用。问题是$stime变量。 如何将变量$stime放入调用命令?

UPD1: 我解决了这个问题!

Invoke-Command -ComputerName '10.10.0.20' -ArgumentList  $stime -ScriptBlock{
$stime = $args[0]
start-Process -FilePath 'C:Program Files7-Zip7z.exe' "a -t7z C:BlueCollar_backupbluecollar_$stime.zip C:ServicesBlueCollar" -wait
}

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

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

[string]$stime = get-date -f 'dd.MM.yyyy
Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {
start-Process -FilePath 'C:Program Files7-Zip7z.exe' -ArgumentsList "a -t7z C:BlueCollar_backupbluecollar_$($Using:stime).zip C:ServicesBlueCollar" -wait
}

另一个看起来更简洁的选项是将 ScriptBlock 设置为文本字符串,然后将其传递给远程计算机:

$ScriptBlock=[ScriptBlock]::Create("start-Process -FilePath 'C:Program Files7-Zip7z.exe' -ArgumentsList 'a -t7z C:BlueCollar_backupbluecollar_$stime.zip C:ServicesBlueCollar'")
Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock $ScriptBlock

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

相关内容

  • 没有找到相关文章

最新更新