不同的CMD不同的行为

时间:2017-08-05 14:39:44

标签: cmd

UPDATE2

现在,当我知道,x32是我使用powershell_ise_x32调试到脚本中的问题并且发现了,$Word.Documentsnull。 因此,Powershell-API for Word在x32 PowerShell中具有不同的行为,然后是64位。

enter image description here

更新

使用PowerShell x32时出现错误,并且不会出现在PowerShell 64位上。真的是这样的。 Powershell x32被执行了,因为我是从Total Commander 32bit开始的。

现在的问题是 - 为什么32位和64位PowerShell有不同的行为?

初步问题:

我编写了一个powershell脚本,用于转换我的WordDocuments并将它们合并为一个。
我编写了一个Batch脚本来启动这个PowerShell脚本。

当我直接在“ Powershell ISE ”中执行脚本时,脚本正常工作

当我通过上下文菜单执行批处理脚本作为管理员时,脚本报告错误。在这种情况下,执行 C:\ WINDOWS \ SysWOW64 \ cmd.exe

当我执行系统上作为管理员时发现的另一个cmd.exe时,所有都可以正常工作: “的 C:\的Windows \ WinSxS文件\ Amd64_microsoft窗口-commandprompt_31bf3856ad364e35_10.0.15063.0_none_9c209ff6532b42d7 \ cmd.exe的

为什么我在不同的cmd.exe中有不同的行为?那些不同的cmd.exe是什么?

enter image description here

enter image description here

enter image description here

批处理脚本:

cd /d "%~dp0"

powershell.exe -noprofile -executionpolicy bypass -file "%~dp0%DocxToPdf.ps1" 
pause

Powershell脚本

$FilePath = $PSScriptRoot
$Pdfsam = "D:\Programme\PDFsam\bin\run-console.bat"




$Files = Get-ChildItem "$FilePath\*.docx"
$Word = New-Object -ComObject Word.Application
if(-not $?){
    throw "Failed to open Word"
}

# Convert all docx files to pdf
Foreach ($File in $Files) {
    Write-Host "Word Object: "  $Word
    Write-Host "File Object: "  $Word $File
    Write-Host "FullName prop:" $File.FullName

    # open a Word document, filename from the directory
    $Doc = $Word.Documents.Open($File.FullName)

    # Swap out DOCX with PDF in the Filename
    $Name=($Doc.FullName).Replace("docx","pdf")

    # Save this File as a PDF in Word 2010/2013
    $Doc.SaveAs([ref] $Name, [ref] 17)
    $Doc.Close()
}

# check errors
if(-not $?){
    Write-Host("Stop because an error occurred")
    pause
    exit 0
}

# wait until the conversion is done
Start-Sleep -s 15


# Now concat all pdfs to one single pdf
$Files = Get-ChildItem "$FilePath\*.pdf" | Sort-Object

Write-Host $Files.Count

if ($Files.Count -gt 0) {

    $command = "" 
    Foreach ($File in $Files) {
        $command += " -f "
        $command += "`"" + $File.FullName + "`""
    }

    $command += " -o `"$FilePath\Letter of application.pdf`" -overwrite concat"
    $command = $Pdfsam + $command
    echo $command

    $path = Split-Path -Path $Pdfsam -Parent 
    cd $path

    cmd /c $command

}else{
    Write-Host "No PDFs found for concatenation"
}




Write-Host -NoNewLine "Press any key to continue...";
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown");

2 个答案:

答案 0 :(得分:0)

我发现$PSScriptRoot不可靠。

$FilePath = $PSScriptRoot;
$CurLocation = Get-Location;
$ScriptLocation = Split-Path $MyInvocation.MyCommand.Path

Write-Host "FilePath = [$FilePath]";
Write-Host "CurLocation = [$CurLocation]";
Write-Host "ScriptLocation = [$ScriptLocation]";

结果:

O:\Data>powershell ..\Script\t.ps1
FilePath = []
CurLocation = [O:\Data]
ScriptLocation = [O:\Script]

至于各种cmd.exe实现之间的差异,我无法真正回答这个问题。我应该认为它们在功能上是相同的,但也许有32/64位差异很重要。

答案 1 :(得分:0)

使用PowerShell x32时出现错误,并且不会出现在PowerShell 64位上。

我使用powershell_ise_x32调试了脚本并发现,using System.IO; using System.Xml.Linq; namespace XmlAddElementWithoutLoading { class Program { static void Main() { var rootelement = "root"; var doc = GetDocumentWithNewNodes(rootelement); var newNodes = GetXmlOfNewNodes(doc); using (var fs = new FileStream("pathToDoc.xml", FileMode.Open, FileAccess.ReadWrite)) { using (var writer = new StreamWriter(fs)) { RemoveClosingRootNode(fs, rootelement); writer.Write(newNodes); writer.Write("</"+rootelement+">"); } } } private static void RemoveClosingRootNode(FileStream fs, string rootelement) { fs.SetLength(fs.Length - ("</" + rootelement + ">").Length); fs.Seek(0, SeekOrigin.End); } private static string GetXmlOfNewNodes(XDocument doc) { var reader = doc.Root.CreateReader(); reader.MoveToContent(); return reader.ReadInnerXml(); } private static XDocument GetDocumentWithNewNodes(string rootelement) { var doc = XDocument.Parse("<" + rootelement + "/>"); var childId = "2"; XNamespace ns = "namespace"; doc.Root.Add(new XElement(ns + "anotherChild", new XAttribute("child-id", childId))); return doc; } } } $Word.Documents

这是因为在我的系统上安装了Word 64bit。