UPDATE2 :
现在,当我知道,x32是我使用powershell_ise_x32调试到脚本中的问题并且发现了,$Word.Documents
是null
。
因此,Powershell-API for Word在x32 PowerShell中具有不同的行为,然后是64位。
更新:
使用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是什么?
批处理脚本:
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");
答案 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。