簡體   English   中英

當由vba調用時,powershell -replace無法正常工作

[英]powershell -replace wont work when called by vba

我有一個Powershell腳本,可以替換字符串中的一些charatere。 字符串如下所示:
1234-長項目名稱
我需要用字符串替換下划線的空間,所以它看起來像這樣: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使用相同的字符串觸發腳本時,它返回以下內容:
1234 _-_ Long_Project_Name

任何人都有一個想法,為什么它不會返回相同的結果。
僅出於信息方面的考慮,我在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的自動更正功能更改,而“-”已由其他更改(不知道字符,它看起來像“-”,但有點長)。

當我從產品機器收到自動生成的郵件時,它實際上工作得很好。

感謝大家的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM