powershell -replace 在 vba 调用时不起作用
powershell -replace wont work when called by vba
我有一个 powershell 脚本,可以从字符串中替换一些字符。字符串如下所示:
1234 - 一个长项目名称
我需要字符串来替换 space 的下划线,所以它看起来像这样: 1234_A_Long_Project_Name
这是我的 powershell 代码的一部分:
...
$projet = $projet -replace '\s+-\s+','_'
$projet = $projet -replace '\s+|_+','_'
...
当我直接在 powershell 中 运行 这个脚本时,它会做我想做的事。问题是我需要从 Outlook 中的 VBA 宏调用脚本,当收到带有特定主题的邮件时,会触发此宏:
sText = Split(olItem.Body, vbCrLf)
Line = Split(sText(1), ":")
If Line(0) = "Projet " Then
projet = Trim(Line(1))
retval = Shell("powershell -noexit c:\script\droit.ps1 '" & projet & "'")
End If
如果我 运行 来自 powershell 的带有字符串“1234 - Long project Name”的脚本,是给我这个:
1234_Long_Project_Name
当脚本被 vba 触发时,使用相同的字符串,return 我是这样的:
1234_-_Long_Project_Name
任何人都知道为什么它不会 return 我得到相同的结果。
仅供参考,我 运行 Win 8.1、powerhsell 4 和 outlook 2013 上的脚本。
谢谢大家
编辑:
这是 powershell 脚本:
Param([string]$projet)
function getPass2($adminName, $encrypted, $domain){
$password = convertto-securestring -string $encrypted
$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $domain$AdminName,$password
$cred
}
$projet = $projet -replace '\s+-\s+','_'
$projet = $projet -replace '\s+|_+','_'
$projet = $projet -replace 'é|è|ê','e'
$projet = $projet -replace 'à','a'
$projet = $projet -replace 'ï','i'
$projet = $projet -replace 'ç','c'
$projet
$encrypted = "123"
$AdminName = "123"
$cred = getPass2 $adminName $encrypted "123"
$exist = $false
#commande for serve1
if ($cred){
$session = New-PSSession -credential $cred -ComputerName "server"
#ScriptBlock server1
$result = Invoke-command -session $session -Args $projet -ScriptBlock {
$projet = $args[0]
#folder copy
if($projet){
$SFolder = "z:\FolderTemplate\"
$DFolder = "z:\DestinationFolder\" + $projet
$FileExists = Test-Path $DFolder
if ($FileExists -eq $false)
{
Copy-Item $SFolder $DFolder -recurse
#acl
$SFolderList = get-childitem -name $SFolder -recurse
foreach ($Folder in $SFolderList) {
$SFullPath = $SFolder + "$Folder"
$DFullPath = $DFolder + "\" + "$Folder"
$NewACL = Get-ACL "$SFullPath"
Set-ACL "$DFullPath" $NewACL
}
}
else
{
$exist = $true
return $exist
}
}
else{
echo "error"
}s
}
Remove-PsSession -session $session
$exist = $result
#Credentiel someserver
$AdminName = "123"
$encrypted = "123"
$credMTL = getPass2 $adminName $encrypted "123"
#commande for some server
if ($credMTL -and !$exist){
$session = New-PSSession -credential $credMTL -ComputerName "server2"
$result = Invoke-command -session $session -Args $projet -ScriptBlock {
$projet = $args[0]
$SFolder = "F:\Folder\template"
$DFolder = "F:\destinationFolder\" + $projet
$FileExists = Test-Path $DFolder
if ($FileExists -eq $false)
{
$shortcutName = $DFolder + "\someLink.lnk"
$shortcutTarget = "\linkPath\" + $projet
Copy-Item $SFolder $DFolder -recurse
$shell = New-Object -COM WScript.Shell
$shortcut = $shell.CreateShortcut($shortcutName)
$shortcut.TargetPath = $shortcut.TargetPath + "\" + $projet
$shortcut.Description = $projet
$shortcut.Save()
$exist = $false
}
else {
$exist = $true
}
return $exist
}
Remove-PsSession -session $session
}
return $result
}
好的,我终于找到了发生的事情。当我在 outlook 中写测试邮件时,这一行被 outlook 的自动更正功能改变了,“-”被别的东西改变了(不知道是什么字符,它看起来像一个“-”但有点长)。
当我从我的产品机器收到一封自动生成的邮件时,它实际上工作得很好。
谢谢大家的帮助。
我有一个 powershell 脚本,可以从字符串中替换一些字符。字符串如下所示:
1234 - 一个长项目名称
我需要字符串来替换 space 的下划线,所以它看起来像这样: 1234_A_Long_Project_Name
这是我的 powershell 代码的一部分:
...
$projet = $projet -replace '\s+-\s+','_'
$projet = $projet -replace '\s+|_+','_'
...
当我直接在 powershell 中 运行 这个脚本时,它会做我想做的事。问题是我需要从 Outlook 中的 VBA 宏调用脚本,当收到带有特定主题的邮件时,会触发此宏:
sText = Split(olItem.Body, vbCrLf)
Line = Split(sText(1), ":")
If Line(0) = "Projet " Then
projet = Trim(Line(1))
retval = Shell("powershell -noexit c:\script\droit.ps1 '" & projet & "'")
End If
如果我 运行 来自 powershell 的带有字符串“1234 - Long project Name”的脚本,是给我这个:
1234_Long_Project_Name
当脚本被 vba 触发时,使用相同的字符串,return 我是这样的:
1234_-_Long_Project_Name
任何人都知道为什么它不会 return 我得到相同的结果。
仅供参考,我 运行 Win 8.1、powerhsell 4 和 outlook 2013 上的脚本。
谢谢大家
编辑: 这是 powershell 脚本:
Param([string]$projet)
function getPass2($adminName, $encrypted, $domain){
$password = convertto-securestring -string $encrypted
$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $domain$AdminName,$password
$cred
}
$projet = $projet -replace '\s+-\s+','_'
$projet = $projet -replace '\s+|_+','_'
$projet = $projet -replace 'é|è|ê','e'
$projet = $projet -replace 'à','a'
$projet = $projet -replace 'ï','i'
$projet = $projet -replace 'ç','c'
$projet
$encrypted = "123"
$AdminName = "123"
$cred = getPass2 $adminName $encrypted "123"
$exist = $false
#commande for serve1
if ($cred){
$session = New-PSSession -credential $cred -ComputerName "server"
#ScriptBlock server1
$result = Invoke-command -session $session -Args $projet -ScriptBlock {
$projet = $args[0]
#folder copy
if($projet){
$SFolder = "z:\FolderTemplate\"
$DFolder = "z:\DestinationFolder\" + $projet
$FileExists = Test-Path $DFolder
if ($FileExists -eq $false)
{
Copy-Item $SFolder $DFolder -recurse
#acl
$SFolderList = get-childitem -name $SFolder -recurse
foreach ($Folder in $SFolderList) {
$SFullPath = $SFolder + "$Folder"
$DFullPath = $DFolder + "\" + "$Folder"
$NewACL = Get-ACL "$SFullPath"
Set-ACL "$DFullPath" $NewACL
}
}
else
{
$exist = $true
return $exist
}
}
else{
echo "error"
}s
}
Remove-PsSession -session $session
$exist = $result
#Credentiel someserver
$AdminName = "123"
$encrypted = "123"
$credMTL = getPass2 $adminName $encrypted "123"
#commande for some server
if ($credMTL -and !$exist){
$session = New-PSSession -credential $credMTL -ComputerName "server2"
$result = Invoke-command -session $session -Args $projet -ScriptBlock {
$projet = $args[0]
$SFolder = "F:\Folder\template"
$DFolder = "F:\destinationFolder\" + $projet
$FileExists = Test-Path $DFolder
if ($FileExists -eq $false)
{
$shortcutName = $DFolder + "\someLink.lnk"
$shortcutTarget = "\linkPath\" + $projet
Copy-Item $SFolder $DFolder -recurse
$shell = New-Object -COM WScript.Shell
$shortcut = $shell.CreateShortcut($shortcutName)
$shortcut.TargetPath = $shortcut.TargetPath + "\" + $projet
$shortcut.Description = $projet
$shortcut.Save()
$exist = $false
}
else {
$exist = $true
}
return $exist
}
Remove-PsSession -session $session
}
return $result
}
好的,我终于找到了发生的事情。当我在 outlook 中写测试邮件时,这一行被 outlook 的自动更正功能改变了,“-”被别的东西改变了(不知道是什么字符,它看起来像一个“-”但有点长)。
当我从我的产品机器收到一封自动生成的邮件时,它实际上工作得很好。
谢谢大家的帮助。