当共享路径包含“$”符号时,如何使用 powershell 将文件从一台服务器复制到另一台服务器
How to copy files from one server to other server with powershell when the shared path contains '$' symbol
我手上有3台远程服务器。让我们说服务器 X、服务器 Y 和服务器 Z。我是 运行 我从本地机器登录到远程服务器 X 的 powershell 脚本。这个服务器 X 是我的基础服务器,它可以访问其他 2 个服务器。我想将此服务器 X 用作基本服务器,并希望将文件从服务器 Y 复制到服务器 Z,由于访问权限的原因,这是不可能通过我的本地计算机进行的。所以我使用管理员凭据登录到服务器 X,该凭据可以访问所有 3 个服务器。登录后,我只是提到 copy-item 命令将文件从服务器 Y 的共享路径复制到服务器 Z 的共享路径。
这是一个与本网站中许多人类似的问题,这里有一个转折点。当我调试时,它显示已完成但我没有得到任何结果。所以我直接在 Server X 中尝试 运行 这个 powershell 脚本,它只包含复制项目命令以及共享文件夹的源和目标路径。当我调试时出现错误,用户没有权限或找不到路径。当我尝试使用相同的凭据手动从共享路径复制和粘贴文件时,它正在运行。但是通过 powershell 脚本,它现在可以工作了。我知道原因。这是因为共享路径中的符号“$”。所以我需要解决方案。它不允许在我的源路径和目标路径中使用“$”符号。有什么选择吗?如果我尝试删除该符号并复制文件,我会收到 'Access Denied' 错误,因为它是共享路径,E 驱动器应以 $ 符号为前缀。
这是我的代码:
#Calling my Server Name, Credentials from App.Config File
$currentDirectory = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path)
$appConfigFile = [IO.Path]::Combine($currentDirectory, 'App.config')
$appConfig = New-Object XML
$appConfig.Load($appConfigFile)
$ServerName = $appConfig.configuration.appSettings.add[0].value
$Username = $appConfig.configuration.appSettings.add[1].value
$Password = ConvertTo-SecureString -String $appConfig.configuration.appSettings.add[2].value -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$Password
使用凭据登录到服务器 X 并将文件从服务器 Y 复制到服务器 Z
Invoke-command -ComputerName $ServerName -Credential $cred -ScriptBlock {
Copy-Item "\ServerY\E$\SourceTestFolder\Test.docx" "\ServerZ\E$\DestTestFolder" }
第一个想法:将 "
替换为 '
。所以 powershell 停止掉落在 $ 符号上。你现在写的方式是:"Hey powershell, go ahead and look for a variable named $E and put it in there".
如前所述,您可以将双引号更改为单引号。通过这样做,您可以告诉 powershell 之间的所有内容都是没有变量的字符串。
您也可以像本例一样使用替换和特殊符号。
但是,如果您有一个在路径中带有 $ 符号的字符串和一个变量怎么办。像这样 $cmd = "sc config something$$variable depend= something/something.
我需要第一个美元符号,因为它在服务名称中,但它是变量。我所做的是通过执行以下操作来修复它。
$cmd = "sc config something#$variable depend= something/something"
$cmd = $cmd -replace "#", '$'
通过执行此 powershell 填充变量,所以我有 $cmd = "sc config something#value depend= something/something"
然后我将 # 替换为 DollarSign,我们就设置好了。
我手上有3台远程服务器。让我们说服务器 X、服务器 Y 和服务器 Z。我是 运行 我从本地机器登录到远程服务器 X 的 powershell 脚本。这个服务器 X 是我的基础服务器,它可以访问其他 2 个服务器。我想将此服务器 X 用作基本服务器,并希望将文件从服务器 Y 复制到服务器 Z,由于访问权限的原因,这是不可能通过我的本地计算机进行的。所以我使用管理员凭据登录到服务器 X,该凭据可以访问所有 3 个服务器。登录后,我只是提到 copy-item 命令将文件从服务器 Y 的共享路径复制到服务器 Z 的共享路径。
这是一个与本网站中许多人类似的问题,这里有一个转折点。当我调试时,它显示已完成但我没有得到任何结果。所以我直接在 Server X 中尝试 运行 这个 powershell 脚本,它只包含复制项目命令以及共享文件夹的源和目标路径。当我调试时出现错误,用户没有权限或找不到路径。当我尝试使用相同的凭据手动从共享路径复制和粘贴文件时,它正在运行。但是通过 powershell 脚本,它现在可以工作了。我知道原因。这是因为共享路径中的符号“$”。所以我需要解决方案。它不允许在我的源路径和目标路径中使用“$”符号。有什么选择吗?如果我尝试删除该符号并复制文件,我会收到 'Access Denied' 错误,因为它是共享路径,E 驱动器应以 $ 符号为前缀。
这是我的代码:
#Calling my Server Name, Credentials from App.Config File
$currentDirectory = [IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path)
$appConfigFile = [IO.Path]::Combine($currentDirectory, 'App.config')
$appConfig = New-Object XML
$appConfig.Load($appConfigFile)
$ServerName = $appConfig.configuration.appSettings.add[0].value
$Username = $appConfig.configuration.appSettings.add[1].value
$Password = ConvertTo-SecureString -String $appConfig.configuration.appSettings.add[2].value -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$Password
使用凭据登录到服务器 X 并将文件从服务器 Y 复制到服务器 Z
Invoke-command -ComputerName $ServerName -Credential $cred -ScriptBlock {
Copy-Item "\ServerY\E$\SourceTestFolder\Test.docx" "\ServerZ\E$\DestTestFolder" }
第一个想法:将 "
替换为 '
。所以 powershell 停止掉落在 $ 符号上。你现在写的方式是:"Hey powershell, go ahead and look for a variable named $E and put it in there".
如前所述,您可以将双引号更改为单引号。通过这样做,您可以告诉 powershell 之间的所有内容都是没有变量的字符串。
您也可以像本例一样使用替换和特殊符号。
但是,如果您有一个在路径中带有 $ 符号的字符串和一个变量怎么办。像这样 $cmd = "sc config something$$variable depend= something/something.
我需要第一个美元符号,因为它在服务名称中,但它是变量。我所做的是通过执行以下操作来修复它。
$cmd = "sc config something#$variable depend= something/something"
$cmd = $cmd -replace "#", '$'
通过执行此 powershell 填充变量,所以我有 $cmd = "sc config something#value depend= something/something"
然后我将 # 替换为 DollarSign,我们就设置好了。