アップデート2:今異なるのCMD異なる振る舞い
私が知っているとき、その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の動作が異なるのはなぜですか?
最初の質問:
私は私のWordDocumentsを変換し、1にそれらをマージする、PowerShellスクリプトを書きました。
私はバッチスクリプトを書いて、このpowershellスクリプトを開始しました。
私は「PowerShellのISE」罰金を作品スクリプト内で直接スクリプトを実行します。
コンテキストメニューからの管理者を実行すると、のエラーが報告されます。この場合、C:\ WINDOWS \ SysWOW64 \ cmd.exeが実行されます。
私は管理者として私のシステムで見つかった別のcmd.exeを実行すると -罰金を作品すべてを: "C:\ WINDOWS \ WinSxS \ん。Amd64 microsoft-Windowsの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");
[ファイルシステムリダイレクタ](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187.aspx)とその他のWoW64ページに関するMicrosoftの記事をお読みください。 '%SystemRoot%\ Syswow64'ディレクトリにある32ビットの' cmd.exe'は、それを起動するアプリケーションが32ビットアプリケーションであるときに起動されます。 32ビットアプリケーションでは、 '%SystemRoot%\ Sysnative \ cmd.exe'を実行して、64ビットWindows上で64ビットの' cmd.exe'を起動することができます。 [管理者の実行でバッチファイルの現在のディレクトリを変更する](https://stackoverflow.com/a/31655249/3074564)の回答も参照してください。 – Mofi
申し訳ありませんが、どのように私の質問に関連している、32ビットと64ビット版のcmdが存在するのですか?そして、ディレクトリを変更することは、バッチスクリプトの 'cd/d"%〜dp0 "'によって固定されます。 – Skip
WinSxSディレクトリに2つのcmd.exeファイルがあります。どちらも通常の場所、 System32では32ビット、SysWOW64では32ビットのビルドをサポートしています。システムのWinSxSディレクトリから直接ファイルを使用しないでください。 – eryksun