Симон Моурир дал этот пример :
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
, где unboxing преобразование (литье) из object
(или из одного из классов System.ValueType
или System.Enum
или из типа интерфейса) - тип значения (кроме Nullable<>
) сам по себе дает NullReferenceException
.
В другом направлении конверсия бокса из a Nullable<>
, которая имеет HasValue
, равную false
, на ссылочный тип, может дать ссылку null
, которая затем может привести к NullReferenceException
. Классический пример:
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:
public static void MyExtension(this object x)
{
x.ToString();
}
следующий код будет проблематичным:
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<>
экземпляров.
Наилучшее объяснение проблемы похоронено в комментарии Nathan Hartley , поэтому позвольте мне суммировать его здесь:
Проблема связана исключительно с разрешениями файловой системы и имеет (консоль и ISE):
Start-Process
без указания целевого каталога с -WorkingDirectory
, текущее местоположение (каталог) PowerShell используется для -Credential
для запуска в качестве другого пользователя - без повышения в этой точке - у целевого пользователя может отсутствовать разрешение на доступ к текущему каталогу, что происходит, если текущий Например, каталог находится внутри поддерева домашнего каталога текущего пользователя. К сожалению, сообщение об ошибке PowerShell скрывает эту причину, вводя в заблуждение сообщение: The directory name is invalid.
Fix:
-WorkingDirectory
для явного задания текущей директории целевого процесса. Для Например, чтобы запустить целевой процесс из каталога, в котором находится целевой скрипт , вы можете использовать что-то вроде:
$script = 'c:\path\to\your\script.ps1'
Start-Process -WorkingDirectory (Split-Path $script) -Credential ...
Это странно, но я воссоздал ошибку, и это исправило ее ...
http://support.microsoft.com/kb/832434
В принципе, измените начальную директорию Powershell_ISE (или PowerGUI!) на общесистемное значение.
Все еще проблема с установкой -WorkingDirectory в каталог exe ... обнаружил, что параметр -WorkingDirectory для C: \ Windows \ System32 и используемый путь fq для работы exe.
У меня такая же ошибка.
Эта функция в порядке с PowerShell ISE, но не работает с PowerGUI
Start-Process -FilePath "C:\WINDOWS\System32\cmd.exe" -Credential $credential -ArgumentList ("/c $sFileExecutable")
Она работает с параметром WorkingDirectory
Start-Process -FilePath 'cmd.exe' -Credential $credential -ArgumentList ("/c $sFileExecutable") -WorkingDirectory 'C:\Windows\System32'
Я знаю, что это может быть немного запоздалым, но выполняете ли вы эту команду, когда текущий каталог является сетевым путем? Я испытал это как проблему, и если я запустил ту же команду с системного диска, это сработает.
Я знаю, что это довольно поздно, но нить помогла мне (в частности, предложение от @Dionysoos ), и надеюсь, что мой ответ может помочь другим.
У меня был тот же error ...
Start-Process : This command cannot be executed due to the error: The directory name is invalid.
... при запуске скрипта без присмотра, пока он работал в ISE.
Неавтоматический скрипт использовал пользовательский $env:TEMP
в качестве рабочего каталога, что означало, что новый процесс не имел к нему доступа. Указание -WorkingDirectory $env:windir
в команде Start-Process
разрешило проблему.